Skip to content

CSharp Cancellation

Codex edited this page Oct 11, 2026 · 2 revisions

Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어

Скасування, пауза та фонові сценарії

Посібник C# · Приклади UO

CancellationTokenSource створює запит скасування, CancellationToken передається операції. Скасування кооперативне: операція перевіряє токен або передає його далі. Вбудований сценарій отримує Cancellation; для очікування використовується WaitAsync.

Простий приклад (Example.csx)

Збережіть цей приклад окремо як Example.csx. Запускайте його незалежно від інших прикладів на сторінці.

Example.csx:

Cancellation.ThrowIfCancellationRequested();
await WaitAsync(10);
UO.Print("Done");

Скасування кооперативне: перевірка токена та WaitAsync реагують на Stop; сторонній код без підтримки скасування може продовжити роботу.

Результат:

Done
for (int i = 0; i < 3; i++)
{
    Cancellation.ThrowIfCancellationRequested();
    await WaitAsync(100);
    UO.Print($"Tick {i}");
}
{
    using var timeout = new CancellationTokenSource(TimeSpan.FromSeconds(1));
    using var linked = CancellationTokenSource.CreateLinkedTokenSource(Cancellation, timeout.Token);
    try
    {
        await Task.Delay(10, linked.Token);
        UO.Print("Operation completed");
    }
    catch (OperationCanceledException) when (timeout.IsCancellationRequested)
    {
        UO.Print("Local timeout");
    }
}

Зупинку сценарію не замінюйте нескінченним перехопленням OperationCanceledException. Довільний блокуючий виклик сторонньої бібліотеки не переривається тільки від наявності токена. Пауза та запит скасування мають різні цілі: пауза зберігає продовження, скасування завершує виконання.

Офіційна документація: Скасування, пауза та фонові сценарії – Microsoft Learn.

Запит скасування кооперативний. Task.Delay без передачі Cancellation, очікування стороннього завдання та бібліотечний виклик без підтримки скасування можуть продовжуватися після натискання Stop. Після запиту про скасування подальші ігрові дії цього виконання заборонені; це означає примусового миттєвого завершення будь-якого .NET-коду.

Clone this wiki locally