.NET 4.5 Async + Await Fire and Forget 潜在的内存泄漏?

cwi*_*lls 6 .net c# memory-leaks asynchronous async-await

我在 ASP.NET 中使用与下面类似的代码进行非关键的即发即弃操作

private void SomeMethod()
{
    FireAndForgetAsync();
}

private async Task FireAndForgetAsync()
{
    // Simulate medium running IO blocking operation
    await Task.Delay(sleepTime).ConfigureAwait(false);

    // Simulating the rare scenario where an error occurs
    throw new Exception("An Error Occurred");
}
Run Code Online (Sandbox Code Playgroud)

该异常是在从异步方法返回的任务中捕获的,这可以防止未处理的异常完全导致应用程序崩溃。

但是这段代码会导致内存泄漏吗?因为返回的任务(及其异常)没有被分配/访问?我的想法是,除非某些 .NET 框架代码持有对该任务的引用,否则它只会被垃圾收集。

m1o*_*1o2 5

您的代码中不存在内存泄漏的风险。至少从您提供的片段来看。

但是,当任务正在完成时,由于未处理的异常,您的应用程序可能会被 CLR 终止。

如果您创建一个任务,并且从未调用过 task.Wait() 或尝试检索任务的结果,则当垃圾收集器收集该任务时,它将在终结期间拆除您的应用程序。有关详细信息,请参阅 MSDN 关于TPL 中的异常处理的页面。

里德·科普西的回答

对此有不止一种解决方案/解决方法。您可以在这篇 SOF 帖子中找到更多相关信息: 通过等待任务或访问其 Exception 属性都没有观察到任务的异常。结果,未观察到的异常是

(正如I3arnon提到的,这种行为在 .Net 4.5 中发生了变化。)

  • 该行为在 .net 4.5 中已更改:[.NET 4.5 中的任务异常处理](http://blogs.msdn.com/b/pfxteam/archive/2011/09/28/task-exception-handling-in-net -4-5.aspx) (4认同)