Skip to content

RU 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