【问题标题】:Handle Exceptions with tasks处理任务异常
【发布时间】:2011-12-09 12:43:45
【问题描述】:

假设我有这样的代码:

serviceCallFinished = false;
Task.Factory.StartNew(() => {
    response = ServiceManager.GeneralService.ServiceMethod(loginName, password);
}).ContinueWith(parentTask => { serviceCallFinished = true; });

while (!serviceCallFinished)
    Thread.Sleep(100);

if (response.UserValid) { }

在这种情况下,ServiceMethod 将抛出 Exception,但这从未显示,相反我会在 response.UserValid 上获得一个空引用?

为什么异常没有交给我的 UI 线程?

注意:这是在 UI 线程上,我的想法是在服务调用期间不要阻塞线程。

【问题讨论】:

  • 它不会回答您的问题,但请删除该循环以等待完成。使用其他东西(manualResetEvent)
  • 这里的主线程是一个UI线程,不能被阻塞,这就是我使用Tread.Sleep的原因。我也不想将方法拆分为能够将线程发送到特定方法。
  • 如果循环的目的是非阻塞的,那你肯定错了:UI 线程在睡眠时被阻塞了。
  • 好的,所以解决这个问题的唯一方法是拆分方法,然后在 ContinueWith 中将线程传递给方法的第二部分(method2)?这将是很多方法,并且代码是否复杂。
  • Joe 回复是用于正确等待和异常管理的回复

标签: c# .net parallel-processing task


【解决方案1】:

您不需要使用这样的标志来等待异步任务完成。使用等待()

Task t = Task.Factory.StartNew(() => {
    response = ServiceManager.GeneralService.ServiceMethod(loginName, password);
});

try
{
    t.Wait();
}
catch (AggregateException e)
{
   ...
}

Wait() 调用将提升整体 AggregateException 中的所有异常。

【讨论】:

【解决方案2】:

从 cmets 来看,与发布的示例相反,您似乎希望在等待响应时返回给调用者的逻辑,然后再做一堆事情。听起来后面的东西也包含很多非常复杂的方法,你想用程序编写。 C# 团队已经听到了您的问题并且很多人都喜欢它,并开发了 async/await 框架,它将完全做到这一点,计划用于 C# 5。或者,如果您可以选择,这里有一个可用的 AsyncCTP:http://www.microsoft.com/download/en/details.aspx?id=9983HTH .

【讨论】:

    【解决方案3】:

    How to: Handle Exceptions Thrown by Tasks 还有一个很好的样本。

    你可以做的基本上是用以下方式替换你的睡眠循环:

    try
    {
        task.Wait();
    }
    catch (AggregateException ae)
    {
      ...
    }
    

    【讨论】:

      【解决方案4】:

      你为什么不写这样的代码:

      Task.Factory.StartNew(() => 
        {
         response = ServiceManager.GeneralService.ServiceMethod(
           loginName, password);
        })
        .ContinueWith(parentTask => { if (response.UserValid) { } });
      

      看起来更清晰,反应更灵敏。

      【讨论】:

        猜你喜欢
        • 2014-03-06
        • 1970-01-01
        • 1970-01-01
        • 2015-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多