System.Threading.Tasks,lambdas,错误处理程序和对象销毁

时间:2013-06-12 03:08:34

标签: c# multithreading

我有一个简单的后台缓存更新程序方法:

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一起使用)?

如果它是一次性物品并且被称为处置会发生什么?

2 个答案:

答案 0 :(得分:0)

Dispose就像任何其他方法一样 - 它对.NET编码器具有特定的意义,它清理资源,但CLR本身并不特别对待它。在没有对象的引用之前,该对象将保持活跃和未完成,包括捕获中的对象。

现在,“alive”是一个相对术语......使用该对象可能会导致ObjectDisposedException,如果它被强健地编码,或者如果没有,可能看似工作未定义的行为。

答案 1 :(得分:0)

拥有StartBackgroundLookup的对象可能会在Task.Factory.StartNew(action)完成之前进行垃圾回收。这两个没有任何关联,除非你有一个对象本身的引用,在action内(作为一个闭包,例如var clo = this;和使用this.Something内部动作不会阻止对象 - 可以由this引用 - 不被垃圾收集)。