C # и Caliburn - RescueAttribute и сопрограммы - PullRequest
4 голосов
/ 10 ноября 2010

Мне кажется, я обнаружил ситуацию, когда RescueAttribute не работает. Или, может быть, я неправильно использую подпрограммы.

У меня есть такая модель просмотра:

[Rescue("Rescue")]
class MyViewModel
{
    //... left out some bus-logic code here ...

    public void Login()
    {
        yield return Show.Busy();

        //the following line will also cause the problem, just like AsyncResult
        //yield return Show.MessageBox("Test");

        yield return new AsyncResult(() => _server.Login());

        //throw new Exception("Aww, snap!");

        yield return Show.NotBusy();
    }

    public void Rescue(Exception exc)
    {
        //Show a messagebox or something
    }
}

AsyncResult реализован так:

using Exec = Caliburn.PresentationFramework.Invocation.Execute;

    public class AsyncResult : IResult
    {
        private readonly Action _function;

        public AsyncResult(Action function)
        {
            _function = function;
        }

        public void Execute(ResultExecutionContext context)
        {
            Exec.OnBackgroundThread(delegate
            {
                try
                {
                    _function();
                }
                catch (Exception exc)
                {
                    Exec.OnUIThread(() => Completed(this, new ResultCompletionEventArgs { Error = exc, WasCancelled = true }));
                    return;
                }
                Exec.OnUIThread(() => Completed(this, new ResultCompletionEventArgs()));
            });
        }

        public event EventHandler<ResultCompletionEventArgs> Completed = delegate { };
    }

Если я раскомментирую исключение в моей вышеупомянутой ViewModel, Rescue не сможет обработать исключение.

Это ошибка в Caliburn или AsyncResult реализован неправильно?

Если вы добавили исключение перед выходом для возврата AsyncResult, Rescue работает просто отлично. Также, если исключение выдается на асинхронном потоке, спасение все еще работает!

РЕДАКТИРОВАТЬ: вы также можете использовать Show.MessageBox вместо AsyncResult для воспроизведения той же проблемы.

Ответы [ 2 ]

3 голосов
/ 11 ноября 2010

Кажется, законная ошибка. Я добавил проблему для этого в трекере Caliburn: http://caliburn.codeplex.com/workitem/7636

РЕДАКТИРОВАТЬ: проблема была исправлена ​​
см .: http://caliburn.codeplex.com/Thread/View.aspx?ThreadId=234229

0 голосов
/ 11 ноября 2010

Я предложил изменить IDispatcher, который может относиться к этой проблеме:

http://caliburn.codeplex.com/Thread/View.aspx?ThreadId=223873

...