在我使用之前
"
但现在我看到其他开发人员使用
newConnectionString
在非异步方法中调用异步方法时,第二个是正确的吗?提前谢谢。
更新:
如果您使用第二个代码段,则必须在UI线程上调用protected async void OnResume() {
await DoWorkAsync(); // assume exception is appropriately handled
await DoOtherWorkAsync();
}
,否则您将获得protected void OnResume() {
SynchronizationContext.Current.Post(async (status) => {
await DoWorkAsync();
await DoOtherWorkAsync();}, null);
}
,因为在非UI线程上SynchronizationContext.Current.Post()
为空。只要在UI线程上实例化NullReferenceException
,就可以在非UI线程上调用SynchronizationContext.Current
来进行任何UI更改。
答案 0 :(得分:2)
这两个例子都在进行不必要的工作。该方法的最佳实现是:
protected void OnResume()
{
DoWorkAsync();
}
在第一种情况下,您强制继续在当前上下文中运行,但该延续没有任何实际操作;它只是毫无意义地在同步上下文中添加了一个帖子。
第二个片段是在当前同步上下文中添加两个两个无意义的帖子,一个是显式的,一个是隐式的。
这两种方法也有async
种添加状态机的方法,即使你实际上并没有充分利用这些功能,所以这些开销都完全被浪费了。
答案 1 :(得分:2)
不,请勿使用SynchronizationContext
。你已经在UI线程上,所以第二个选项真的没有意义。
请注意,通常应避免使用async void
。在这种情况下,我认为这是可以接受的,因为您实际上正在处理OnResume
,就好像它是事件处理程序一样:
protected async void OnResume()
{
await DoWorkAsync();
}