代码之家  ›  专栏  ›  技术社区  ›  jonathanpeppers

C#和Caliburn-救援属性和协作

  •  4
  • jonathanpeppers  · 技术社区  · 14 年前

    我想我找到了一个救援属性被破坏的情况。或者我用错了共同程序。

    我有一个这样的视图模型:

    [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中的一个bug,还是AsyncResult实现错误?

    如果将异常放在yield之前以返回AsyncResult,那么Rescue工作得很好。如果抛出异常 异步线程,救援仍然有效!

    编辑:您也可以使用Show.MessageBox而不是AsyncResult来重现相同的问题。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Marco Amendola    14 年前

    这似乎是一个合法的错误。我在Caliburn跟踪器中添加了一个问题: http://caliburn.codeplex.com/workitem/7636


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

        2
  •  0
  •   RobDemo    14 年前

    我提议对IDispatcher进行一个可能适用于此问题的更改:

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