我有一个简单的后台缓存更新程序方法:
void StartBackgroundLookup( string username )
{
Action action = () =>
{
(...)//A 'lengthy' lookup here
Cache.Set(key, xxx, cachePolicy);
};
Task.Factory.StartNew(action).ContinueWith(task => MyErrorHandler(task.Exception), TaskContinuationOptions.OnlyOnFaulted);
}
错误处理程序是一种私有的非静态方法:
private void MyErrorHandler(Exception error)
{
//msg logged here
}
我的理解是正确的,StartBackgroundLookup是一个方法,即使它超出范围,也不会在任务完成之前完成(原因是在lambda中使用Cache,而且一个实例MyErrorHandler与ContinueWith一起使用)?
如果它是一次性物品并且被称为处置会发生什么?
答案 0 :(得分:0)
Dispose
就像任何其他方法一样 - 它对.NET编码器具有特定的意义,它清理资源,但CLR本身并不特别对待它。在没有对象的引用之前,该对象将保持活跃和未完成,包括捕获中的对象。
现在,“alive”是一个相对术语......使用该对象可能会导致ObjectDisposedException
,如果它被强健地编码,或者如果没有,可能看似工作未定义的行为。
答案 1 :(得分:0)
拥有StartBackgroundLookup
的对象可能会在Task.Factory.StartNew(action)
完成之前进行垃圾回收。这两个没有任何关联,除非你有一个对象本身的引用,在action
内(作为一个闭包,例如var clo = this;
和使用this.Something
内部动作不会阻止对象 - 可以由this
引用 - 不被垃圾收集)。