我有一个异步方法:
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();
)。我试图通过以下代码确保任务以“fire and forget”的方式被调用:
public void OtherMethod()
{
...
Task.Factory.StartNew(() =>
{
await DoSomethingAsync();
}); //fire and forget again here
}
然而,这并没有像期望的那样运行。所以我的问题是:
如何在没有使用
await
的情况下调用DoSomethingAsync()
,使其始终运行且完成?(我不关心AppDomain重新启动/崩溃的情况)如果我删除
DoSomethingAsync()
中所有的async/await
代码,并使用.ContinueWith()
替换await
,则调用Task DoSomethingAsync()
(方法声明中没有async
)将被调用并确保完成(忽略AppDomain重新启动/崩溃的情况)。如果可以,请问从调用开始需要多长时间(如果任务在10分钟后才被调用,我想我不会感到满意)?
DoSomethingAsync()
的主体被try catch
包装了起来,如果出现异常,则会记录异常。但是我没有看到任何异常被生成。 - langtu