.NET 异步编程

async/await用法

  1. async是用来修饰方法,如果单独出现,方法会警告没有什么作用
  2. await在方法体内部,只能放在async修饰的方法内,必须放在task前面
  3. async/await方法里面如果没有返回值,默认返回一个Task,或者void(推荐用Task,而不是void,因为这 样才能await/wait)
  4. 带asvnc+await后,返回值要多一层Task<>

使用Thread

scss 复制代码
new Thread(() =>
{
    Thread.Sleep(1000);
    Console.WriteLine("吃饭");
    Thread.Sleep(1000);
    Console.WriteLine("睡觉");
    Thread.Sleep(1000);
    Console.WriteLine("打豆豆");
}).Start();

使用Task

arduino 复制代码
await Task.Run(() =>
{
    Thread.Sleep(1000);
    Console.WriteLine("吃饭");
    Thread.Sleep(1000);
    Console.WriteLine("睡觉");
    Thread.Sleep(1000);
    Console.WriteLine("打豆豆");
});

但是 Task 存在问题:

  1. 若不加await,则可能方法还未执行完程序就关闭了
  1. 若每个方法都加await,原本的并行操作又会成为串行

此时可改写代码:

less 复制代码
List<Task> tasks = new List<Task>();

tasks.Add(Task.Run(() =>
{
    Thread.Sleep(1000);
    Console.WriteLine("吃饭");
    Thread.Sleep(1000);
    Console.WriteLine("睡觉");
    Thread.Sleep(1000);
    Console.WriteLine("打豆豆");
}));

tasks.Add(Task.Run(() =>
{
    Thread.Sleep(1000);
    Console.WriteLine("吃饭");
    Thread.Sleep(1000);
    Console.WriteLine("睡觉");
    Thread.Sleep(1000);
    Console.WriteLine("打豆豆");
}));

Task.WaitAll(tasks.ToArray());

参考: .NET WaitAll - 掘金 (juejin.cn)

相关推荐
codedx30 分钟前
LangChain 和 LangGraph 构建的 Agent 项目模版
后端·langchain·agent
葫芦和十三1 小时前
图解 MongoDB 08|ESR 原则:复合索引的字段顺序怎么定
后端·mongodb·agent
葫芦和十三9 小时前
图解 MongoDB 07|索引类型:七种索引,七种访问形状
后端·mongodb·agent
朦胧之10 小时前
AI 编程-老项目改造篇
java·前端·后端
爱勇宝13 小时前
我做了一个只用来搜歌词的小 App
android·前端·后端
IT_陈寒14 小时前
SpringBoot自动配置坑了我一晚上,原来问题出在这
前端·人工智能·后端
SelectDB14 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
SelectDB15 小时前
秒级弹性、最高降本 70%:SelectDB Serverless 如何重塑云数仓资源效率
大数据·后端·云原生
PinkSun15 小时前
Spring AI ChatMemory踩坑实录:重启丢数据、Agent丢记忆、对话溢出
后端·ai编程
壹方秘境15 小时前
我用Go语言开发了一个跨平台的HTTPS抓包和调试工具
前端·后端·ios