我有以下程序:
class myClass
{
CancellationTokenSource cts;
public string someMethod(){
someMethodWhichIsAsync("10")
}
private async Task<string> someMethodWhichIsAsync(string data)
{
if(cts != null)
{
cts.Cancel();
}
cts = new CancellationTokenSource();
string myString = await Task.Run(() => someLoop(data,cts.Token) );
return "success";
}
private string someLoop(string data, CancellationToken token)
{
while (True)
{
if (token.IsCancellationRequested == true)
{
return "Canceled";
}
//Do some work in a continuous loop
}
return "successful end";
}
}
我放置了CancellationTokenSource cts;在类全局范围内,以便每次运行任何函数时都可用。
但是cts.Cancel();仅当我将其包含在运行的函数中时才起作用。
if (token.IsCancellationRequested == true)
{
return "Canceled";
}
这是为什么?我发现的示例代码都不需要这样做。
答案 0 :(得分:0)
好吧,正如我从文档中看到的那样,CancellationTokenSource.Cancel仅发送一个应该取消该进程的信号。然后,使用源令牌,检查是否已请求取消(仅当您之前调用Cancel方法时,它才为True)。因此,此行对于实际取消操作是必需的。