【发布时间】:2014-08-12 09:15:19
【问题描述】:
我在 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");
}
在从异步方法返回的任务中捕获异常,这可以防止未处理的异常导致应用程序完全崩溃。
但是这段代码会导致内存泄漏吗?因为没有分配/访问返回的任务(及其异常)?我的想法是,除非某些 .NET 框架代码持有对任务的引用,否则它只会被垃圾收集。
【问题讨论】:
-
您应该为此使用
QueueBackgroundWorkItem。如果您受限于 .NET 4.5.1 或更早版本,您可以使用IRegisteredObject,查看 Stephen Cleary 的 "Fire and Forget on ASP.NET"。 -
Task不会有任何问题。你会发现一些解释为什么你不需要在这里处理Task:blogs.msdn.com/b/pfxteam/archive/2012/03/25/10287435.aspx -
请注意,如果工作进程在没有警告的情况下回收,则永远不能保证在 ASP.NET 中完成后台工作。预计有时会在没有任何迹象的情况下丢失此类工作。
标签: c# .net asynchronous memory-leaks async-await