C# 火并忘任务和丢弃

25

我需要对一些异步方法进行“fire and forget”的调用。我发现VS建议我可以将该调用设置为一个_discard,这样IDE的警告就消失了。但我不确定在使用discard时,是否仍然没有等待该调用。它会吗?

 public async Task<object> SomeSideTaskToBeForgotten()
 {
     ...blah blah
 }

 public async Task MainTask()
 {
     ..some stuff
     _ = SomeSideTaskToBeForgotten(); //is this still fire and forget?
     ..some other stuff
 }

8
""符号会舍弃返回的任务而不等待它完成。" = await SomeSideTaskToBeForgotten();" 会等待任务完成,然后舍弃结果。 - A Friend
还要检查这个:https://dev59.com/Z2Eh5IYBdhLWcg3wPhdT - noseratio - open to work
1
只需记住,“fire and forget”意味着“我不在乎这是否成功”。 - Gabriel Luci
@GabrielLuci,别担心,如果它失败了,任务的结果对我来说并不重要。 谢谢! - Selim Balci
1个回答

25

是的,它仍然是“fire and forget”。

SomeSideTaskToBeForgotten();返回一个Task时,你的方法剩余部分将执行,而不等待Task完成。

使用discard只是明确表示Task不需要进行进一步处理。

VS建议使用discard,因为SomeSideTaskToBeForgotten();返回了一个值,即不为void。但添加discard也会抑制警告,因为它向编译器表明并未意外省略了await操作。


我认为这里存在误解。一旦任务完成,await不会被跳过;它将控制权交给调用函数,直到等待的任务返回,此时执行继续在await之后的语句。 - Denis G. Labrecque
@Denis,什么是await?OP的代码中没有await - Johnathan Barclay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接