异步编程(进阶)
一:异步编程任务终止
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");
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现