【问题标题】:Task.Factory.StartNew thowing exceptionTask.Factory.StartNew 抛出异常
【发布时间】:2012-04-02 11:27:50
【问题描述】:

我正在使用 Task.Factory.StartNew 使长处理服务调用 UI 线程。但是,一旦我加载应用程序,我就会收到以下异常,

通过等待任务或访问其异常属性未观察到任务的异常。结果,未处理的异常被终结器线程重新抛出。

Task.Factory.StartNew(() => this.InitializeViewModel(myViewModel));

private void InitializeViewModel(IModel myViewModel)
{
    lock (viewModelLock)
    {
        myViewModel.MyContext = this.MyContext; // this will set the MyContext property which in turn makes some service calss
    }
}

这里我不能使用 task.wait() b'coz 那么它会导致 UI 线程等待..

我怎样才能避免这个异常??

谢谢。

【问题讨论】:

  • Task.Factory.StartNew 的调用在哪里?
  • 您应该查看该异常的InnerExcpetion 并修复它,而不是试图忽略它。

标签: c# wpf


【解决方案1】:

作为第一个解决方法/调试帮助将您的 lock (...) 包装在 try-catch 内并在 catch-Block 内设置断点 - 这样您应该能够看到问题

对于Task.Wait 的问题 - 您可以使用ContinueWith 方法来获取异常:

var task = Task.Factory.StartNew(() => this.InitializeViewModel(myViewModel));
task.ContinueWith(o => MyErrorHandler(task.Exception), TaskContinuationOptions.OnlyOnFaulted);

不要忘记处理程序:

void MyErrorHandler(Exception error)
{
 // handle the exception (log, or whatever)
}

【讨论】:

  • 我正在使用 ContinueWith 并且它没有抛出错误,这是处理它的正确方法,还是我应该写一些不会抛出异常的东西......请指导
  • 我使用这样的东西来记录意外错误,是的,我认为这是正确处理此问题的一种方法 - 但当然您应该编写代码来处理错误
猜你喜欢
  • 1970-01-01
  • 2013-05-24
  • 2011-05-30
  • 1970-01-01
  • 2014-05-16
  • 2011-02-25
  • 2012-01-24
相关资源
最近更新 更多