美文网首页csharp
异步编程(五):async/await模式之取消执行

异步编程(五):async/await模式之取消执行

作者: 曦航老袁 | 来源:发表于2019-02-24 20:18 被阅读0次

在async/await模式下,一些.NET的异步方法是允许取消执行的。System.Theading.Tasks命名空间(更正:此处应该是System.Theading命名空间)中有两个类是为此目的而设计的:CancellationToken和CancellationTokenSource。

  • CancellationToken对象包含一个任务是否应被取消的信息。
  • 拥有CancellationToken对象的任务需要定期检查其令牌(token)状态。如果CancellationToken对象的IsCancellationRequested属性为true,任务需停止其操作并返回。
  • CancellationToken是不可逆的,并且只能使用一次。
  • CancellationTokenSource对象创建可分配给不同任务的CancellationToken对象。任何持有CancellationTokenSource对象都可以调用其Cancel方法,这将使CancellationToken的IsCancellationRequested属性被设置为true。
    下面的代码展示了如何使用CancellationTokenSource和CancellationToken来实现取消操作。请注意,该过程是协同的。即调用CancellationTokenSource的Cancel时,它本身并不会执行取消操作,而是会将CancellationToken的IsCancellationReqested属性设置为true。包含CancellationToken的代码负责检查该属性,并判断是否需要停止执行并返回。
class Program
{
    static void Main()
    {
        CancellationTokenSource cts = new CancellationTokenSource();
        CancellationToken token = new CancellationToken();

        MyClass mc = new MyClass();
        Task t = mc.RunAsync(token);

        Thread.Sleep(3000);
        cts.Cancel();

        t.Wait();
        Console.WriteLine("Was Cancellationed: {0}",token.IsCancellationRequested);
    }
 }

class MyClass
{
    public async Task RunAsync(CancellationToken ct)
    {
        if (ct.IsCancellationRequested) return;
        await Task.Run(() => CycleMethod(ct), ct);
    }

    void CycleMethod(CancellationToken ct)
    {
        Console.WriteLine("Starting CycleMethod");
        const int max = 5;
        for (int i = 0; i < max; i++)
        {
            if (ct.IsCancellationRequested) return;         // 监控CancellationToken
            Thread.Sleep(1000);
            Console.WriteLine("     {0} of {1} iterations completed", i + 1, max);
        }
    }
}

代码中循环设置为5次,但3秒后被取消,产生的结果如下:

Starting CycleMethod
     1 of 5 iterations completed
     2 of 5 iterations completed
     3 of 5 iterations completed
Was Cancellationed: True

相关文章

网友评论

    本文标题:异步编程(五):async/await模式之取消执行

    本文链接:https://www.haomeiwen.com/subject/pgibyqtx.html