0

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

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

如果它是一次性对象并调用 dispose 会发生什么?

4

2 回答 2

0

拥有的对象StartBackgroundLookup可能在您Task.Factory.StartNew(action)完成之前被垃圾收集。除非您在内部引用了对象本身,否则这两者没有任何关系action(例如,作为闭包,likevar clo = this;并使用this.Something内部操作不会阻止对象 - 可以被引用this- 被垃圾收集)。

于 2013-06-12T04:20:41.620 回答
0

Dispose就像任何其他方法一样——它对 .NET 编码器具有清理资源的特殊含义,但 CLR 本身并没有特别对待它。该对象将保持活动状态且未完成,直到没有对它的引用,包括捕获中的引用。

现在,“活着”是一个相对术语……如果它被健壮地编码,则使用该对象可能会导致一个ObjectDisposedException,或者如果不是,则可能会导致看似工作未定义的行为。

于 2013-06-12T03:29:58.287 回答