7

正如其他地方所提到的,新的 .NET async/await 模型像病毒一样通过软件层传播。最近的异步更改现在已经出现在我的视图模型中,我想知道从public void DoStuff()to是否是安全的更改声明public async Task DoStuff()

谢谢!

4

4 回答 4

18

现在 Caliburn.Micro 对异步编程模型的支持已经很好了。

您可以做的几件事:

  • 在 Action 方法中使用 async/await。请注意,由于操作方法在技术上是事件处理程序,因此您应该这样做async void而不是async Task.
  • Screen 事件的异步事件处理程序,如 Activated、ViewLoaded 等。
  • Screen 方法的异步覆盖:OnInitialize、OnActivate、...您可以覆盖 then,因为protected override async void OnInitialize(){}您可以在内部等待另一个任务。
  • 将协程转换为任务。使用ExecuteAsync()扩展方法。协程在某些场景下仍然有一些优势,比如执行上下文。
  • IHandleWithTask<TMessage>- 很方便...

一篇博客文章描述了一些带有少量代码片段的用例。还有一个GitHub 存储库,其中包含我曾经在 Caliburn 中使用 async/await 的示例项目。

于 2013-07-16T09:05:05.667 回答
2

答案是肯定的,从 Caliburn.Micro 1.5 开始。

发布公告

于 2013-03-20T15:35:26.193 回答
2

它是安全的,但会破坏您现有的全局异常处理。在我进行重构之后,我不再看到任何错误对话框,为了解决这个问题,我必须订阅该Coroutine.Completed事件:

Coroutine.Completed += (s, a) =>
{
    //Do something here ...
};

你可以在你的App.xaml.cs文件中做到这一点。

我的代码中关于如何处理我的应用程序中出现的所有可能错误的示例:

protected override void OnStartup(StartupEventArgs e)
{
    SetupExceptionHandlers();
    base.OnStartup(e);
}

private void SetupExceptionHandlers()
{
    AppDomain.CurrentDomain.UnhandledException += (s, a) =>
    {
        HandleException((Exception)a.ExceptionObject, "AppDomain.CurrentDomain.UnhandledException");
    };

    Current.DispatcherUnhandledException += (s, a) =>
    {
        HandleException(a.Exception, "Application.Current.DispatcherUnhandledException");
        a.Handled = true;
    };

    TaskScheduler.UnobservedTaskException += (s, a) =>
    {
        Dispatcher.InvokeAsync(() => HandleException(a.Exception, "TaskScheduler.UnobservedTaskException"));
        a.SetObserved();
    };

    Coroutine.Completed += (s, a) =>
    {
        if (a.Error != null)
        {
            HandleException(a.Error, "Coroutine.Completed");
        }
    };
}

private void HandleException(Exception exception, string source)
{
    logger.Error(exception, "Unhandled exception occured (Source: {0})", source);

    var msg = new ShowErrorDialogEvent(exception, exception.GetBaseException().Message);
    eventAggregator.PublishOnUIThread(msg);
}

如果您想知道,loggereventAggregator变量OnStartup在调用DisplayRootViewFor.

于 2019-04-10T06:48:13.043 回答
1

Caliburn.Micro 项目的项目经理Marco Amendola写了一篇文章,标题是:协程已死。协程万岁。他这样命名它是因为异步/等待编程模型的出现,如果你阅读这篇文章,你会发现异步/等待让 Coroutines 过去所做的事情变得栩栩如生,所以我假设你可以在你拥有的地方安全地使用它们之前用过协程。我建议你阅读这篇文章。

于 2013-03-14T22:49:54.817 回答