Я использую класс 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
, будут перехвачены, и для свойства Error
RunWorkerCompletedEventArgs будет установлен доступ к моему обработчику 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
. Как мне этого добиться?