gpt4 book ai didi

c# - 检查 CancellationToken 是否已被取消

转载 作者:行者123 更新时间:2023-12-04 16:42:11 25 4
gpt4 key购买 nike

我创建了一个小演示项目来帮助我了解如何使用取消 token 。我了解您取消了 token 并检查是否已请求取消,但是有没有办法可以检查取消是否已实现?在下面的示例中,我不想在 DoWork() 完成运行之前再次运行 Work()。

public class Program
{
public static CancellationTokenSource tokenSource;

private static void Main(string[] args)
{
while (true)
{
Work();
}
}

public static async void Work()
{
tokenSource = new CancellationTokenSource();
Console.WriteLine("Press any key to START doing work");
Console.ReadLine();
Console.WriteLine("Press any key to STOP doing work");
DoWork(tokenSource.Token);
Console.ReadLine();
Console.WriteLine("Stopping...");
tokenSource.Cancel();
}

public static async void DoWork(CancellationToken cancelToken)
{
while (true)
{
Console.WriteLine("Working...");
await Task.Run(() =>
{
Thread.Sleep(1500);
});

if (cancelToken.IsCancellationRequested)
{
Console.WriteLine("Work Cancelled!");

return;
}
}
}
}

最佳答案

您通常不想让您的 DoWork 函数 async void 而是改为 async Task。这样您就可以看到它何时完成(或被取消)。

您可能还想使用 cancelToken.ThrowIfCancellationRequested()。这会抛出一个 OperationCanceledException,您可以捕获它。

public class Program
{
public static CancellationTokenSource tokenSource;

private static async Task Main(string[] args)
{
while (true)
{
await Work();
}
}

public static async Task Work()
{
tokenSource = new CancellationTokenSource();
Console.WriteLine("Press any key to START doing work");
Console.ReadLine();
Console.WriteLine("Press any key to STOP doing work");

var task = DoWork(tokenSource.Token);

Console.ReadLine();
Console.WriteLine("Stopping...");
tokenSource.Cancel();

try
{
await task;
}
catch (OperationCanceledException)
{
// Task was cancelled
}
}

public static async Task DoWork(CancellationToken cancelToken)
{
while (true)
{
Console.WriteLine("Working...");
await Task.Run(() =>
{
Thread.Sleep(1500);
});

cancelToken.ThrowIfCancellationRequested();
}
}
}

此代码依赖于 C# 7 中引入的“async main”。如果您没有这个,您可以将 Main 方法编写为:

private static void Main(string[] args)
{
while (true)
{
Work().Wait();
}
}

关于c# - 检查 CancellationToken 是否已被取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58285559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com