簡體   English   中英

WPF-使用BackgroundWorker使用異步命令進行錯誤處理

[英]WPF - error handling with asynchronous command using BackgroundWorker

我正在使用此博客文章中AsyncDelegateCommand類,但是在知道如何處理action委托中發生的異常時遇到了麻煩。 我創建以下命令:

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並將其塞入Error以便在RunWorkerCompleted進行處理的異常。 我該如何實現?

Arrgh,沒關系,這是Visual Studio為我做的事情:

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

-BackgroundWorker.DoWork事件

我在VS中使用調試器運行應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM