【问题标题】:C# not waiting for an async method to finish [duplicate]C#不等待异步方法完成[重复]
【发布时间】:2015-06-04 01:56:39
【问题描述】:

我的代码中有一个特定位置,用于发送电子邮件。好吧,在这里等待这个方法完成并不重要,这只是一个应该在不久的将来发生的任务,但不一定现在。

我想知道这是否安全:

// some stuff here...

Task.Run(SendEmail);

// and here too... but don't wait for the email to be sent, just go!!

这样好吗?这个方法会一直执行吗?它不会导致任何线程阻塞问题,对吗(假设方法本身是线程安全的)?

另外,运行此类任务的好方法是什么?打电话比较好:

SendEmail();

前提是这个方法是async?

public static async Task SendEmail()

【问题讨论】:

  • 无法回答这是否会导致阻塞。 “SendEmail”方法以及您与之共享的任何数据是线程安全的吗?
  • 这是一个静态方法,不连接任何东西。它只是在自己的范围内制作一些东西并向外部服务器发送请求。
  • 如果您发布 SendEmail 方法的声明会有所帮助
  • 那你为什么认为它会引起问题?
  • @Randolph:请注意,如果这是一个 ASP.NET 应用程序,则几乎可以肯定,即发即弃是一个错误。

标签: c# multithreading parallel-processing


【解决方案1】:

是的,该方法只会“运行”。除非在该方法中引发异常,否则不会阻止该方法无法成功执行。

如果你想知道所有工作完成后任务的状态,只需从Task.Run方法中获取Task实例,然后检查它的状态(你想在访问之前等待任务检查它是否成功结束)。例如,您可以检查 Task.Exception 属性。

【讨论】:

  • 请问使用#pragma warning disable CS4014 是否是个好主意?
  • 不,不是。修复问题,如this 对编译器警告的解释(我会选择选项#2)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 2014-08-09
  • 2023-03-16
  • 2020-10-04
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
相关资源
最近更新 更多