正如其他地方所提到的,新的.NET async / await模型通过像病毒这样的软件层传播。最近的异步变化现在已经冒充我的视图模型,我想知道这是否是从public void DoStuff()
到public async Task DoStuff()
的安全更改声明?
谢谢!
Caliburn.Micro中对异步编程模型的支持现在相当不错。
你可以做的事情很少:
async void
而不是async Task
。protected override async void OnInitialize(){}
然后在里面等待另一个任务。ExecuteAsync()
扩展方法。协程在某些情况下仍然具有一些优势,例如执行上下文。IHandleWithTask<TMessage>
- 非常方便......有a blog post desribing some use cases的代码片段很少。还有一个GitHub repository with sample project,我曾经在Caliburn中玩async / await。
答案是'是',从Caliburn.Micro 1.5开始。
Caliburn.Micro项目的项目经理Marco Amendola撰写了一篇文章,其标题为:Coroutines are dead. Long live Coroutines.,由于异步/等待编程模型的出现,他以这种方式命名,如果您阅读文章,您会看到异步/等待将Coroutines过去所做的事情变为现实,所以我认为你可以安全地使用它们之前使用过Coroutines。我建议你阅读这篇文章。
它是安全的,但会破坏您现有的全局异常处理。在我进行重构之后,我没有看到任何错误对话,为了解决这个问题,我不得不订阅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) =>
{
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
方法中从bootstrapper类实例化。