c# - 触发并忘记异步任务方法有时不会调用

标签 c# .net asp.net-mvc async-await fire-and-forget

我有一个异步方法:

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
}

但是,这并不像预期的那样工作。所以我的问题是:

  1. 如何在没有 await 的情况下调用 DoSomethingAsync() 始终运行并完成? (我不关心 AppDomain 重启/崩溃的情况)

  2. 如果我删除 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/

相关文章:

c# - 使用 Nhibernate 过滤与聚合根一起返回的子集合

c# - Utf8Json根据标记字段反序列化为类型

asp.net-mvc - ASP.Net MVC 4 和 WebApi 的身份验证

asp.net-mvc - 自定义 MVC 验证属性和 Bootstrap 格式问题

c# - 如何清除所有 datagridview 行,包括第一行(我试过 Dgv.DataSource = null; Dgv.Rows.Clear();)

c# - LINQ 数据绑定(bind)到 GridView 和 RowDataBound 的问题

c# - 我可以在没有过多引用的情况下使用控制台应用程序截屏或打印屏幕吗

C#:如何在检查相等性时评估一个对象的多个计算机类?

.net - 从 2.6 升级到 3.0 后出现 NServiceBus 模拟问题

c# - 在 iframe 中使用 RedirectToAction 后,ASP.NET MVC session 会重置