我在C#中使用包含任务的模式
Task.Factory.StartNew( .something... )
.ContinueWith(t=> {
try{ t.Wait() }
catch(Exception ex) ...
});
如果something
例如包含WCF代码或其他异常抛出内容。这样我确定任务已经等待我没有得到那些终结器异常,我可以一致地记录错误消息。
最近我看到t.Wait()抛出了ObjectDisposed异常。我的模式是错误的,还是应该仅在TaskContinuationOptions.NotOnRanToCompletion
上保持继续。
答案 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);