C# Task.ContinueWith and.wait()。ObjectDisposedException?

C# Task.ContinueWith and.wait()。ObjectDisposedException?,c#,task-parallel-library,C#,Task Parallel Library,我使用一种模式,其中包括C#中的任务 Task.Factory.StartNew( .something... ) .ContinueWith(t=> { try{ t.Wait() } catch(Exception ex) ... }); 例如,如果某物包含WCF代码或

我使用一种模式,其中包括C#中的任务

Task.Factory.StartNew( .something... )
            .ContinueWith(t=> {
                                 try{ t.Wait() }
                                 catch(Exception ex) ...
                               });
例如,如果
某物包含WCF代码或其他异常抛出内容。通过这种方式,我确信任务已经被等待,我不会得到那些终结器异常,并且我可以一致地记录错误消息

最近我看到t.Wait()抛出ObjectDisposed异常。我的模式是否错误,或者我是否应该仅使用on
TaskContinuationOptions继续。不自动完成

如果继续正在启动,则很明显它已完成(以某种方式);对于已经完成的事情,不需要等待()。只需检查它是如何完成的(完成、取消(
.IsCanceled
),异常(
.IsFaulted
),并在适当的情况下访问结果(
.result

ObjectDisposedException
听起来像是臭名昭著的WCF“功能”,通过WCF中的
Dispose()
可以抛出上述内容(这很烦人)。有多种方法可以包装WCF来处理这个问题,但这与任务API无关。因此,WCF接受了实际错误,并呈现出
ObjectDisposedException
。有几个stackoverflow问题可以解决这个问题。

如果继续触发,很明显它已经完成(以某种方式);对于已经完成的事情,不需要等待()。只需检查它是如何完成的(完成、取消(
.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);

您可以使用以下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);

因此,您的意思是,如果我只访问t.Exception,我可以避免终结器异常“通过等待任务未观察到任务的异常”,如此处所述:@svrist,该消息的结尾是“或访问其异常属性”;所以是的-检查异常会将其标记为已观察到(我刚刚在控制台exe中也验证了这一点),因此您的意思是,如果我只访问t.exception,我可以避免终结器异常“通过等待任务也未观察到任务的异常”,如这里所述:@svrist,该消息的结尾是“或访问其异常属性”,所以是的-检查异常确实会标记它已观察到(我刚刚在控制台exe中验证了这一点)谢谢svrist,我很快就看到了!谢谢svrist,我很快就看到了!