2010-10-20 112 views
1

我正在使用this blog post中的AsyncDelegateCommand類,但我無法知道如何處理髮生在我的action委託中的異常。我創建了下面的命令:WPF - 使用異步命令使用BackgroundWorker進行錯誤處理

new AsyncDelegateCommand(
    readFile, // action to perform 
    () => shouldReadFile, // can the action be executed? 
    obj => readFileFinished(true), // run after action successfully completed 
    ex => readFileFinished(false) // run after action failed 
) 

我期待在我readFile方法拋出的異常被抓住併爲RunWorkerCompletedEventArgsError屬性進行設置,對我來說,我BackgroundWorker.RunWorkerCompleted處理程序訪問。但是,當我運行我的應用程序時,我停止了readFile拋出的其中一個例外,所以我從來沒有將它交給RunWorkerCompleted的處理程序。這裏是我的AsyncDelegateCommand構造:

public AsyncDelegateCommand(Action action, Func<bool> canExecute, 
    Action<object> completed, Action<Exception> error) 
{ 
    if (null == action) 
    { 
     throw new ArgumentNullException("action"); 
    } 
    _worker.DoWork += (sender, e) => 
    { 
     CommandManager.InvalidateRequerySuggested(); 
     // This can possibly throw an exception: 
     action(); 
    }; 
    _worker.RunWorkerCompleted += (sender, e) => 
    { 
     if (null != completed && null == e.Error) 
     { 
      completed(e.Result); 
     } 
     // I never make it here: 
     if (null != error && null != e.Error) 
     { 
      error(e.Error); 
     } 
     CommandManager.InvalidateRequerySuggested(); 
    }; 
    _canExecute = canExecute; 
} 

我想爲任何異常action罰球被捕獲並塞進ErrorRunWorkerCompleted處理。我如何實現這一目標?

回答

1

Arrgh,沒關係,它的Visual Studio做的東西對我來說:

如果操作引發你的代碼不處理異常,BackgroundWorker的捕捉異常,並將其傳遞到RunWorkerCompleted事件處理程序,它作爲System.ComponentModel.RunWorkerCompletedEventArgs的Error屬性公開。如果您正在Visual Studio調試器下運行,則調試器將在引發未處理的異常的DoWork事件處理程序中斷開。

- BackgroundWorker.DoWork Event

我跑我的應用程序在VS調試器