正如其他地方所提到的,新的 .NET async/await 模型像病毒一样通过软件层传播。最近的异步更改现在已经出现在我的视图模型中,我想知道从public void DoStuff()
to是否是安全的更改声明public async Task DoStuff()
?
谢谢!
正如其他地方所提到的,新的 .NET async/await 模型像病毒一样通过软件层传播。最近的异步更改现在已经出现在我的视图模型中,我想知道从public void DoStuff()
to是否是安全的更改声明public async Task DoStuff()
?
谢谢!
现在 Caliburn.Micro 对异步编程模型的支持已经很好了。
您可以做的几件事:
async void
而不是async Task
.protected override async void OnInitialize(){}
您可以在内部等待另一个任务。ExecuteAsync()
扩展方法。协程在某些场景下仍然有一些优势,比如执行上下文。IHandleWithTask<TMessage>
- 很方便...有一篇博客文章描述了一些带有少量代码片段的用例。还有一个GitHub 存储库,其中包含我曾经在 Caliburn 中使用 async/await 的示例项目。
答案是肯定的,从 Caliburn.Micro 1.5 开始。
见发布公告。
它是安全的,但会破坏您现有的全局异常处理。在我进行重构之后,我不再看到任何错误对话框,为了解决这个问题,我必须订阅该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);
}
如果您想知道,logger
和eventAggregator
变量OnStartup
在调用DisplayRootViewFor
.
Caliburn.Micro 项目的项目经理Marco Amendola写了一篇文章,标题是:协程已死。协程万岁。他这样命名它是因为异步/等待编程模型的出现,如果你阅读这篇文章,你会发现异步/等待让 Coroutines 过去所做的事情变得栩栩如生,所以我假设你可以在你拥有的地方安全地使用它们之前用过协程。我建议你阅读这篇文章。