using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;
public class Haligali : MonoBehaviour
{
[SerializeField] private float duration = 0.1f;
private CancellationTokenSource _cancellationTokenSource;
private CancellationToken Token => _cancellationTokenSource.Token;
private bool IsRunning => _cancellationTokenSource != null;
public void Trigger()
{
if (IsRunning)
{
_cancellationTokenSource.Cancel();
}
else
{
RunInternal();
}
}
private async void RunInternal()
{
_cancellationTokenSource = new CancellationTokenSource();
// try catch ๋ฅผ ์ฌ์ฉํ ๊ฒ์ cancellation token์ด ์บ์ฌ๋๋ ๊ฒ์ ๊ฐ์งํ๊ธฐ ์ํจ์.
try
{
await UniTask.Delay(TimeSpan.FromSeconds(duration), cancellationToken: Token);
Debug.Log("process done");
}
catch
{
Debug.Log("process cancelled");
}
// ํ ํฐ์ด ์บ์ฌ๋์๋์ง์๋ ์๊ด์์ด ํจ์ ์ข ๋ฃ์ ํ ํฐ์ dispose ํ ํ์๊ฐ ์์.
_cancellationTokenSource.Dispose();
_cancellationTokenSource = null;
}
// ์คํํธํจ์์์ ํ ์คํธ ์์
private void Start()
{
Test();
}
// ํ ์คํธ์ฉ ํจ์
private async void Test()
{
// process cancelled (์ด๋ก ์ ์ผ๋ก ๋์์ ํธ๋ฆฌ๊ฑฐ ๋ ๊ฒฝ์ฐ)
Trigger();
Trigger();
// process cancelled
Trigger();
await UniTask.Delay(TimeSpan.FromSeconds(0.01f));
Trigger();
// process cancelled
Trigger();
await UniTask.Delay(TimeSpan.FromSeconds(0.05f));
Trigger();
// process cancelled
Trigger();
await UniTask.Delay(TimeSpan.FromSeconds(0.1f));
Trigger();
// process done
Trigger();
await UniTask.Delay(TimeSpan.FromSeconds(0.2f));
Trigger();
}
}
์ ๋ํ์คํฌ ์ฐ๋๊ฒ๋ ํจ ๊ฒํ ํด๋ด ๋ด๊ฐ ์์ฆ ์์ฃผ์ฐ๋ ํจํด์ธ๋ฐ ์ด๊ฑฐ ์ข์๊ฑด์ง๋ ๋๋ ๋ชฐ๋ฆ.
๊ณ ์๋ค ์์ผ๋ฉด ์ด๊ฑฐ ๊ด์ฐฎ์์ง๋ ๋ต๋ณ ๋ถํํจ.
์ฝ๊ฐ ๊ฝ๊ธฐํ๊ฑฐ๋ ํ ํฐ์ ๋งค๋ฒ new๋ก ๋ง๋ค์ด์ฃผ๋๊ฑด๋ฐ ์ด๊ฑฐ๋ง๊ณ ๋ ๋ชจ๋ฅด๊ฒ ์.
์ฝ๋์ ์์ด๋์ด๋ย
1. cancellationToken์ ์๋ก ๋ง๋ค๊ณ 0.1์ด ๊ธฐ๋ค๋ ธ๋ค๊ฐ disposeํ๋ ๋น๋๊ธฐํจ์๊ฐ ์๊ณ
ย 1-1. ํ ํฐ์ด ์ทจ์๋๋ฉด, ์ทจ์ ํจ์ ํธ์ถ (์ฌ๊ธฐ์๋ catch ์์ย Debug.Log("process cancelled");)
ย 1-1. UniTask.Delay ๋น๋๊ธฐย ํจ์ ์๋ฃ ์ดํ, ์๋ฃ ํจ์ ํธ์ถ (์ฌ๊ธฐ์๋ tryย ์์ย Debug.Log("process done");)
2. cancellationToken์ด ์์ผ๋ฉด ํด๋น ํ ํฐ์ ์ทจ์ํ๊ธฐ, ์์ผ๋ฉด 1๋ฒ์ ๋น๋๊ธฐํจ์๋ฅผ ์คํํ๋ ํจ์
๋น ๊ฒ์์ค๋ธ์ ํธ์ ํด๋น ์ปดํฌ๋ํธ ๋ฌ๊ณ ์คํํ๋ฉด Testํจ์ ์คํํด ๋ณผ ์ ์์.
์ผ๋จ์ ๋ด ํ๊ฒฝ์์๋ ์ ์๋ํ๋ ๊ฒ ๊ฐ์.
๋๊ธ 1