取消C#异步函数
我有以下程序:取消C#异步函数,c#,asynchronous,async-await,task,C#,Asynchronous,Async Await,Task,我有以下程序: class myClass { CancellationTokenSource cts; public string someMethod(){ someMethodWhichIsAsync("10") } private async Task<string> someMethodWhichIsAsync(string data) { if(cts != null) {
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。Cancel只是发送一个信号,表明进程应该被取消。然后,使用源的令牌,检查是否已请求取消(只有在之前调用Cancel方法时才成立)。因此,这一行是实际取消操作所必需的。异步取消是协作的:取消令牌源只是一个信号,它不会停止任何操作。你需要办理取消手续。无论是抛出异常还是优雅地放弃您所做的任何事情……示例代码都可能使用另一种技术,例如使用ThrowIfCancellationRequested。然后,它将通过catch块退出。ThrowIfCancellationRequested是否会工作,即使线程已超过ThrowIfCancellationRequested在取消请求发生之前运行的点。在这种情况下,如何取消运行时间较长的函数(如HTTP调用)在我的代码中,取消是有效的,因为有一个循环,但是在非循环中你会怎么做呢cases@megaman-你不能。取消您无法控制的代码的唯一(半)安全的方法是启动一个全新的操作系统级进程并在那里运行代码-如果需要,您可以终止该进程。@megaman,这取决于具体情况。对于网络功能,您可以在发送取消时取消请求或关闭连接,这就是CancellationToken的Register方法的作用。如果使用Thread()而不是Task()可以执行取消和睡眠之类的操作吗
if (token.IsCancellationRequested == true)
{
return "Canceled";
}