2012-04-02 170 views
2

我使用Task.Factory.StartNew使长处理服务调用关闭UI thread.However,我收到follwing例外,只要我加载应用程序,Task.Factory.StartNew异常触发的异常

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

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线程等待..

我怎样才能避免这种例外?

谢谢。

+0

那个调用'Task.Factory.StartNew'的地方在哪里? – leppie 2012-04-02 11:38:53

+2

您应该查看该异常的'InnerExcpetion'并修复它,而不是试图忽略它。 – svick 2012-04-02 11:43:40

回答

1

作为第一个解决方法/调试的帮助包住lock (...)一个try-catch内,并设置catch - 块中的断点 - 这样,你应该能够看到这个问题

为了与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) 
} 
+0

我正在使用ContinueWith,它没有抛出错误,它是处理它的正确方式,还是我应该写一些不会抛出异常的指令。请指导 – 2012-04-02 12:00:01

+0

我使用类似这样的事情来记录意外错误,并且是我认为这是处理这个问题的一种方式 - 但是当然你应该编写代码来处理错误 – Carsten 2012-04-02 12:01:54