的任务.ContinueWith和.wait().ObjectDisposedException

本文关键字:ObjectDisposedException wait 任务 ContinueWith | 更新日期: 2023-09-27 18:15:16

我在c#中使用了一个包含任务的模式

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

如果something示例包含WCF代码或其他异常抛出的东西。这样我就可以确定任务已经被等待了,我不会得到那些终结器异常,我可以一致地记录错误消息。

最近我看到t.t wait()抛出objectdispose异常。是我的模式错了,还是我应该只保留TaskContinuationOptions.NotOnRanToCompletion上的继续

的任务.ContinueWith和.wait().ObjectDisposedException

如果延续正在触发,很明显它已经完成了(不管怎样);已经完成的事情没有必要再加Wait()。只需检查如何完成(完成,取消(.IsCanceled),异常(.IsFaulted)),并在适当的情况下访问结果(.Result)。

ObjectDisposedException听起来像臭名昭著的WCF"功能",在WCF中Dispose()可以抛出上述(这很烦人)。有各种各样的方法可以包装WCF来处理这个问题,但这与任务API无关。因此,WCF忽略了实际的错误,并显示了ObjectDisposedException。有几个stackoverflow问题可以解决这个问题。

您可以使用以下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);
相关文章:
  • 没有找到相关文章