我有一个异步方法:
public async Task DoSomethingAsync(){
...
await ...
await ...
....
return await SaveAsync();
}
大多数时候,我通过以下方式调用此方法:
await DoSomethingAsync()
此调用按预期工作。但是在某个地方,我需要将此方法称为 fire and forget:
public void OtherMethod()
{
...
DoSomethingAsync(); //fire and forget here
}
在这种情况下,有时任务 DoSomethingAsync()
运行并完成,但有时任务从未被调用(或在 DoSomethingAsync() 中调用一些
但永远不要完成最后一个 await
await SaveAsync();
)。
我正在尝试通过这些代码确保任务将以即刻即忘的方式调用:
public void OtherMethod()
{
...
Task.Factory.StartNew(() =>
{
await DoSomethingAsync();
}); //fire and forget again here
}
但是,这并不像预期的那样工作。所以我的问题是:
如何在没有
await
的情况下调用DoSomethingAsync()
始终运行并完成? (我不关心 AppDomain 重启/崩溃的情况)如果我删除
DoSomethingAsync()
中的所有async/await
代码并将await
替换为.ContinueWith()
,然后调用Task DoSomethingAsync()
(在方法声明中没有async
)将被调用并确保完成(忽略 AppDomain 重启/崩溃的情况) ,如果是,距离通话还有多长时间(如果 Task 将在 10 分钟后被调用,我认为我不会高兴)?
最佳答案
您可能在 DoSomethingAsync
的某处遇到异常,您无法观察到该异常,因为您忽略了该任务。这正是您要求的行为,因为您是在告诉代码“忘记”该任务。
要观察异常,你不能“忘记”任务:
public Task OtherMethodAsync()
{
...
return DoSomethingAsync();
}
并且在某个时候,await
(或Wait
)返回的任务。这就是您知道任务将运行和完成的方式。
关于c# - 触发并忘记异步任务方法有时不会调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22665532/