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 框架代码持有对该任务的引用,否则它只会被垃圾收集。
您的代码中不存在内存泄漏的风险。至少从您提供的片段来看。
但是,当任务正在完成时,由于未处理的异常,您的应用程序可能会被 CLR 终止。
如果您创建一个任务,并且从未调用过 task.Wait() 或尝试检索任务的结果,则当垃圾收集器收集该任务时,它将在终结期间拆除您的应用程序。有关详细信息,请参阅 MSDN 关于TPL 中的异常处理的页面。
对此有不止一种解决方案/解决方法。您可以在这篇 SOF 帖子中找到更多相关信息: 通过等待任务或访问其 Exception 属性都没有观察到任务的异常。结果,未观察到的异常是
(正如I3arnon提到的,这种行为在 .Net 4.5 中发生了变化。)
归档时间: |
|
查看次数: |
4314 次 |
最近记录: |