C# 一个人应该等待一个背景,开火然后忘记任务吗?

C# 一个人应该等待一个背景,开火然后忘记任务吗?,c#,asp.net,task,background-process,C#,Asp.net,Task,Background Process,这两种选择的区别是什么: HostingEnvironment.QueueBackgroundWorkItem(async () => await UpdateStatsAsync(id)) 及 当涉及到排队客户端实际上不需要依赖的一些后台工作时?在这种情况下,我将使用非异步版本,如HostingEnvironment。QueueBackgroundWorkItem有一个重载,该重载接受取消令牌,并返回一个任务,因此您的代码如下所示: HostingEnvironment.QueueBa

这两种选择的区别是什么:

HostingEnvironment.QueueBackgroundWorkItem(async () => await UpdateStatsAsync(id))


当涉及到排队客户端实际上不需要依赖的一些后台工作时?

在这种情况下,我将使用非异步版本,如
HostingEnvironment。QueueBackgroundWorkItem
有一个重载,该重载接受
取消令牌
,并返回一个
任务
,因此您的代码如下所示:

HostingEnvironment.QueueBackgroundWorkItem(ct => UpdateStatsAsync(id));

在内部,此重载
等待
s为您提供此功能。这种方法的一个缺点是,如果您使用作用域从
内部返回
任务
,或者
尝试
/
捕获
,您可能会因为不等待
任务
而感到意外,但在这个简单的场景中,您不必担心这一点。

在这种情况下,我将使用非异步版本,as
HostingEnvironment.QueueBackgroundWorkItem
有一个重载,它接受
CancellationToken
并返回一个
任务,因此您的代码如下所示:

HostingEnvironment.QueueBackgroundWorkItem(ct => UpdateStatsAsync(id));

在内部,此重载
等待
s为您提供此功能。这种方法的一个缺点是,如果您使用
作用域从
内部返回
任务
,或者
尝试
/
捕获
,您可能会因为不等待
任务
而感到意外,但在这个简单的场景中,您不必担心这一点。

查看@Icemanind:谢谢,这些答案并不清楚,而且相互矛盾。Stephen Cleary的回答谈到了一般异步与同步情况:/公认的答案是详细而准确的。克利里的回答是一个奇怪的贡献;似乎没有真正解决所问问题的实际因素。但这并不意味着这个问题与你的问题完全不同。我接电话时你关了门。我把我的答案记录在这里,哪怕只是为了发泄我的愤怒。区别在于-第一个错误地将UpdateStatsAsync()包装到一个额外的任务中,该任务稍后必须再次展开。-第二个更容易阅读。重新打开;这个问题是关于将异步工作排队到QBWI的两种不同方式;是关于排队异步工作和排队同步工作。看看@Icemanind:谢谢,这些答案并不清楚,而且相互矛盾。Stephen Cleary的回答谈到了一般异步与同步情况:/公认的答案是详细而准确的。克利里的回答是一个奇怪的贡献;似乎没有真正解决所问问题的实际因素。但这并不意味着这个问题与你的问题完全不同。我接电话时你关了门。我把我的答案记录在这里,哪怕只是为了发泄我的愤怒。区别在于-第一个错误地将UpdateStatsAsync()包装到一个额外的任务中,该任务稍后必须再次展开。-第二个更容易阅读。重新打开;这个问题是关于将异步工作排队到QBWI的两种不同方式;是关于排队异步工作与排队同步工作。这些惊喜是因为在
HostingEnvironment.QueueBackgroundWorkItem
中实现了基本的
async void
?这与“是”类似,因此如果您有一个
示例,请尝试
/
catch
,如果在
try
块中没有
wait
Task
返回方法,您将返回一个
Task
,等待时将抛出该方法。您认为自己捕捉到了错误,这是可以原谅的,但是因为您没有在
try
块中等待,所以您不会捕捉到异常。这些意外是因为
HostingEnvironment.QueueBackgroundWorkItem
中的底层
async void
实现导致的。类似的是,因此,如果您有一个
try
/
catch
,例如,如果在
try
块中没有
wait
任务返回方法,您将返回一个
Task
,等待时将抛出该方法。您认为自己捕获到了错误,这是可以原谅的,但是由于您没有在
try
块中等待,因此您将无法捕获那里的异常。