取消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";
        }