最新内容优先发布于个人博客:小虎技术分享站,随后逐步搬运到博客园。
创作不易,如果觉得有用请在Github上为博主点亮一颗小星星吧!
博主开始学习编程于11年前,年少时还只会使用cin
和cout
,给单片机点点灯。那时候,类似async/await
和future/promise
模型的认知还不是很够,因此一直使用着最传统的Thread
模型实现异步。顶多使用ThreadPool
线程池来实现对线程资源的复用。而现在我们有更现代方法,在.net
环境下可以使用现代C#
提供的async/await
关键字方便地实现基于任务异步模型的异步调用。
完整代码下载见:Github
一个基本的异步方法
假设我们定义以下这个异步方法模型,在函数上作用async
关键字实现在控制台异步输出字符串。
static async Task FooAsync()
{
Console.WriteLine("Foo.");
}
突然发现VS2022的提示说由于没有Task.Run
或者await
还是同步方法。。。
根据这个提示我们修改上述的方法使之满足异步方法的要求
static async Task FooAsync()
{
Task.Run(() => Console.WriteLine("Foo."));
}
为了展示各种简单的异步方法,我们写了以下的demo来演示
namespace AsyncBasic
{
internal class Program
{
static async Task BasicFuncAsync()
{
await Task.Run(
() => Console.WriteLine("Hello Basic Func Async.")
);
}
static async Task LoopFuncAsync()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine($"Loop func {i}.");
await Task.Delay(100);
}
}
static async Task FooAsync()
{
Console.WriteLine("Foo.");
}
static async Task<int> BasicFuncWithRetAsync()
{
Console.WriteLine("Basic func with return value.");
await Task.Delay(1000);
return 10086;
}
static async IAsyncEnumerable<int> GenerateEnumerableAsync()
{
for (int i = 0; i < 10; ++i)
{
yield return i;
await Task.Delay(100);
}
}
static async Task Main(string[] args)
{
Console.WriteLine("Hello Async Basic.");
Task task1 = LoopFuncAsync();
Task task2 = BasicFuncAsync();
Task<int> task3 = BasicFuncWithRetAsync();
Task.WaitAny(task2, task3);
Console.WriteLine($"Basic Func Async ret value: {task3.Result}");
Task.WaitAll(task1, task2, task3);
Console.WriteLine($"Generate Enumerable Async");
await foreach (int i in GenerateEnumerableAsync())
{
Console.WriteLine($"Async Enumerable: {i}");
}
}
}
}
值得一提的是C# 8.0以后可以使用await foreach
来消费异步产生的列表
本文展示了基本的异步方法使用,计划后续再撰文记录异步方法的取消功能等更高级话题。
演示效果如下:
参考链接
https://www.cnblogs.com/cplemom/p/14290789.html
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容