.NET 4.5中不完整的异步任务有什么影响?

时间:2014-01-11 06:21:50

标签: c# async-await

假设您有一个Web处理程序,它调用这样的异步方法:

var foo = await SomeMethod();

而且,由于编码不佳(没有CancellationToken,没有超时等),SomeMethod永远不会完成。反过来,沮丧的用户在她的浏览器上按下“停止”并转到酒吧。

假设这种情况发生在很多用户身上。

我知道我可以写一个超时来防止它永远等待,但如果我不这样做......会发生什么?这是内存泄漏吗?它最终会被清理干净吗?什么是最糟糕的情况?

2 个答案:

答案 0 :(得分:3)

  

SomeMethod永远不会回来。用户取消请求并转到酒吧。

这些都不是一回事。

如果SomeMethod永远不会完成,那么就会发生内存泄漏。 You should never, ever, ever write code that does this.

OTOH,如果用户取消请求(取消CancellationToken),那么方法完成,可能使用OperationCanceledException

答案 1 :(得分:2)

这取决于SomeMethod返回的Task的实现。该任务负责调用continuation(ContinueWith),这将继续执行执行。如果任务从未继续,则会出现内存泄漏。大多数异步API都会提供超时,以防止出现这种情况。