Task_Dispose_NotCompleted错误,但我不知道为什么

时间:2015-11-30 14:41:00

标签: c# task using-statement

今天我遇到了一个关于任务的非常奇怪的错误。在我的代码中,我尝试以这种方式使用using语句:

protected MyClass() {
    using(var initTask = new Task(() => Init())) {
        initTask.ContinueWith(result => InitCompletedCallBack(result));
        initTask.Start();
    }
}

protected virtual void Init() {}

private void InitCompletedCallBack(AsyncResult result) {
    // Stuff
}

当我执行此代码时,我得到一个Task_Dispose_NotComplete错误。 InitCompletedCallBack完成后发生错误。

尝试arounf时我将使用改为:

using(var initTask = new Task(() => Init())) {
    initTask.ContinueWith(result => InitCompletedCallBack(result));
    initTask.Start();
    Thread.Sleep(1000);
}

这很有效。但是,这段代码将在应用程序启动时执行几次,从而将应用程序冻结大约15-20秒。但它表明某事(在任务内部?)需要至少一秒才能完成。

任何想法导致这种行为的原因是什么?

提前致谢。

修改 当我将时间设置为等待100毫秒时,会发生错误。 StackTrace的第一行是:

bei System.Threading.Tasks.Task.Dispose(Boolean disposing)
bei System.Threading.Tasks.Task.Dispose()
bei MyClass..ctor() in c:\Path\to\source\MyClass.cs:line 33.

第33行是使用块的结束括号。

1 个答案:

答案 0 :(得分:2)

  

任何想法导致这种行为的原因是什么?

您的代码会导致此行为。您处置尚未完成的任务。为什么要在处理它的地方处置它?使用块在你放置的地方有意义吗?

不要处置您仍然依赖的任务。删除使用块。