Task.ContinueWith和.wait()。的ObjectDisposedException?

时间:2011-11-18 08:21:51

标签: c# task-parallel-library

我在C#中使用包含任务的模式

Task.Factory.StartNew( .something... )
            .ContinueWith(t=> {
                                 try{ t.Wait() }
                                 catch(Exception ex) ...
                               });

如果something例如包含WCF代码或其他异常抛出内容。这样我确定任务已经等待我没有得到那些终结器异常,我可以一致地记录错误消息。

最近我看到t.Wait()抛出了ObjectDisposed异常。我的模式是错误的,还是应该仅在TaskContinuationOptions.NotOnRanToCompletion上保持继续。

2 个答案:

答案 0 :(得分:3)

如果 continuation 正在触发,很明显它已经完成(以这种或那种方式);对于已完成的事情,无需Wait()。只需检查如何完成(完成,取消(.IsCanceled),例外(.IsFaulted)),并在适当的时候访问结果(.Result)。

ObjectDisposedException听起来像臭名昭着的WCF“功能”,其中WCF中的Dispose()可以抛出上述内容(这很烦人)。提出了各种方法来包装WCF来处理这个问题,但这与任务API无关。 WCF因此吞下实际错误,并且表面ObjectDisposedException。有几个stackoverflow问题可以解决这个问题。

答案 1 :(得分:1)

您可以使用以下TaskContinuationOptions来查看任务的完成情况。

var t = Task.Factory.StartNew(...)
(....)
 t.ContinueWith(task => (..Ran to Completion.. + task.Result),   TaskContinuationOptions.OnlyOnRanToCompletion);    
t.ContinueWith(task => (..Handle Exception .. + task.Exception),
       TaskContinuationOptions.OnlyOnFaulted);
t.ContinueWith(task => (.. Was cancelled..),
       TaskContinuationOptions.OnlyOnCanceled);