C# 中不同的 Async/Await 模式如何影响执行时间?
异步等待:等待与非等待(启动后忽略)
代码详解
考虑以下代码:
<code class="language-csharp">static async Task Callee() { await Task.Delay(1000); } static async Task Caller() { Callee(); // #1 启动后忽略 await Callee(); // #2 >1s Task.Run(() => Callee()); // #3 启动后忽略 await Task.Run(() => Callee()); // #4 >1s Task.Run(async () => await Callee()); // #5 启动后忽略 await Task.Run(async () => await Callee()); // #6 >1s } static void Main(string[] args) { var stopWatch = new Stopwatch(); stopWatch.Start(); Caller().Wait(); stopWatch.Stop(); Console.WriteLine($"Elapsed: {stopWatch.ElapsedMilliseconds}"); Console.ReadKey(); }</code>
调用逻辑
#1: 最简单的启动后忽略方式。 #2: 简单等待。 #3: 在线程池线程上启动异步方法并忽略结果。 #4: 在线程池线程上启动异步方法并异步等待其完成。 #5: 与 #3 相同。 #6: 与 #4 相同。
Task.Run 与异步 Lambda 表达式
虽然 Task.Run 会启动一个新线程,但 Task.Run(async => ...) 等效于 Task.Factory.StartNew(async => ...), 它会在线程池上创建一个新任务并立即启动它。
启动后忽略的注意事项
需要注意的是,启动后忽略的方法可能会导致未处理的异常,从而导致应用程序崩溃。因此,在使用它们之前,务必仔细考虑其影响。
以上是不同的异步/等待模式如何影响 C# 中的执行时间?的详细内容。更多信息请关注PHP中文网其他相关文章!