gpt4 book ai didi

c# - 异步/等待有/没有等待(即发即弃)

转载 作者:太空宇宙 更新时间:2023-11-03 17:38:24 25 4
gpt4 key购买 nike

我有以下代码:

static async Task Callee()
{
await Task.Delay(1000);
}

static async Task Caller()
{
Callee(); // #1 fire and forget
await Callee(); // #2 >1s
Task.Run(() => Callee()); // #3 fire and forget
await Task.Run(() => Callee()); // #4 >1s
Task.Run(async () => await Callee()); // #5 fire and forget
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();
}

#1 以最简单的方式触发并遗忘。 #2 只是等待。有趣的事情从#3 开始。调用背后的深层逻辑是什么?

我知道在 ASP.NET 中使用 fire'n'forget caveats 指出 here .我问这个,因为我们正在将我们的应用程序移动到我们不再可以使用 HostingEnvironment.QueueBackgroundWorkItem(async cancellationToken => await LongMethodAsync()); 的服务结构,建议是简单地替换它与 Task.Run

我看到 Task.Run 运行了一个新线程,#3 和 #5 之间有什么区别?

最佳答案

I'm asking this, because we're moving our app to service fabric where we no longer can use HostingEnvironment.QueueBackgroundWorkItem(async cancellationToken => await LongMethodAsync()); and the advice is to simply replace it with Task.Run.

这是个糟糕的建议。你应该使用 separate background process separated from your web frontend by a queue .

What's the in-depth logic behind the calls?

  1. 在当前线程上启动异步方法。忽略所有结果(包括异常(exception))。
  2. 在当前线程上启动异步方法。异步等待它完成。这是调用异步代码的标准方式。
  3. 在线程池线程上启动异步方法。忽略所有结果(包括异常(exception))。
  4. 在线程池线程上启动异步方法。异步等待它完成。
  5. 与#3 完全相同。
  6. 与#4 完全相同。

关于c# - 异步/等待有/没有等待(即发即弃),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46053175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com