异步编程(进阶)

一:异步编程任务终止

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");
复制代码

 

posted @   后跳  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示