Repository navigation
RU CSharp Cancellation
Українська · Русский · English · Deutsch · Français · Italiano · Español · 繁體中文 · 日本語 · 한국어
CancellationTokenSource создаёт запрос отмены, CancellationToken передаётся операции. Отмена кооперативна: операция проверяет токен или передаёт его дальше. Встроенный сценарий получает Cancellation; для ожидания используется WaitAsync.
Сохраните этот пример отдельно как 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-кода.
ClassicUO — Bad Newbie & C# Scripts IDE