• 异步编程(进阶)


    一:异步编程任务终止

    public readonly struct CancellationToken 用于获取提前终止的信号。

    一般通过 CancellationTokenSource来创建CancellationToken 

    来看取消请求的例子:

    using System.Text;
    using System.Threading.Tasks;
    
    CancellationTokenSource tcs=new CancellationTokenSource();
    tcs.CancelAfter(TimeSpan.FromSeconds(5)); 
    await Print(tcs.Token);
    
     async Task Print(CancellationToken cancellationToken)
    {
        for (int i = 0; i < 10; i++)
        {
            await Task.Delay(1000);
            Console.WriteLine(i);
            if (cancellationToken.IsCancellationRequested)
            {
                Console.WriteLine("IsCancellationRequested...");
                break;
            }
        } 
    
    }

    输出

     线程取消报异常:

    using System.Text;
    using System.Threading.Tasks;

    CancellationTokenSource tcs=new CancellationTokenSource();
    tcs.CancelAfter(TimeSpan.FromSeconds(5));
    await Print(tcs.Token);

    async Task Print(CancellationToken cancellationToken)
    {
    for (int i = 0; i < 10; i++)
    {
    await Task.Delay(1000);
    Console.WriteLine(i);
    //if (cancellationToken.IsCancellationRequested)
    //{
    // Console.WriteLine("IsCancellationRequested...");
    // break;
    //}
    cancellationToken.ThrowIfCancellationRequested();
    }

    }

    Task.WhenAll / Task.WhenAny

     Task.WhenAll 

    IEnumerable<Task<string>> tasks = new[] { GetStr1(), GetStr2(), GetStr3() };
    
    string[] strs= await Task.WhenAll(GetStr1(),GetStr2(),GetStr3());//==>//Task.WhenAll(tasks);
    
    foreach (var item in strs)
    {
        Console.WriteLine(item);
    }
    
    Task<string> GetStr1() => Task.FromResult("GetStr1");
    Task<string> GetStr2() => Task.FromResult("GetStr2");
    Task<string> GetStr3() => Task.FromResult("GetStr3");

     Task.WhenAny

    var strs = await Task.WhenAny(GetStr1(), GetStr2(), GetStr3());//==>//Task.WhenAll(tasks);
    
    if (strs.IsCompleted)
    {
    Console.WriteLine(strs.Result);
    }
    
    
    Task<string> GetStr1() => Task.FromResult("GetStr1");
    Task<string> GetStr2() => Task.FromResult("GetStr2");
    Task<string> GetStr3() => Task.FromResult("GetStr3");
  • 相关阅读:
    最长上升子序列
    system call filters failed to install; check the logs and fix your configuration or disable system c
    linux centos 7 安装vnc远程服务
    Delphi XE 错误提示: [MySQL]-314. Cannot load vendor library [libmysql.dll orlibmysqlld.dll]
    MYSQL 修改密码的几种方式
    MySQL 常用操作和字段类型
    Java 获取GUID
    C# 获取GUID
    C++ 获取GUID
    Delphi GUID[2] 获取GUID值的方式
  • 原文地址:https://www.cnblogs.com/Zingu/p/15839188.html
Copyright © 2020-2023  润新知