取消C#异步功能

时间:2019-03-02 22:09:20

标签: c# asynchronous async-await task

我有以下程序:

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

这是为什么?我发现的示例代码都不需要这样做。

1 个答案:

答案 0 :(得分:0)

好吧,正如我从文档中看到的那样,CancellationTokenSource.Cancel仅发送一个应该取消该进程的信号。然后,使用源令牌,检查是否已请求取消(仅当您之前调用Cancel方法时,它才为True)。因此,此行对于实际取消操作是必需的。