2012-04-02 171 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