2015-06-03 92 views
0

我在代码中有一个特定的地方,我正在发送一封电子邮件。那么,在这里等待这个方法完成并不重要,这只是一个应该在不久的将来发生的任务,但不一定是现在。C#没在等待异步方法完成

我想知道这是否是安全的:

// 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() 
+0

不可能回答这是否会导致阻塞。 “SendEmail”方法以及您与之共享的任何数据都是线程安全的吗? –

+0

这是一个静态方法,没有连接任何东西。它只是在自己的范围内创建一些东西,并向外部服务器发送请求。 –

+0

如果你发布SendEmail方法的声明 –

回答

3

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

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

+0

请问如果使用#pragma warning禁用CS4014是个好主意? –

+1

不,它不是。解决编译器警告中的[this](https://msdn.microsoft.com/en-us/library/hh873131.aspx)解释问题(我会选择#2)。 –