我想要一个方法(让我们称之为 M1 )在循环中执行一些async
代码(让我们称之为第二种方法 M2 )。在每次迭代时 - 应使用 M2 的结果更新UI。
为了等待 M2 , M1 需要为async
。但是 M1 应该在UI线程上运行(以避免竞争条件),因此将在没有await
的情况下调用它。
我是否认为通过这种方式, M1 更新UI将在UI线程上?
(额外:在这种情况下似乎可以async void
。这是正确的吗?)
答案 0 :(得分:1)
是。 (假设您使用返回到UI线程的同步上下文 - 即来自WinForm / WPF的一个。)
请注意,这也意味着您无法以在UI线程上运行的方式调度CPU密集型操作。
使用void async
是在WinForms中处理事件的非常标准的方法:
void async click_RunManyAsync(...)
{
await M1();
}
void async M1()
{
foreach (...)
{
var result = await M2();
uiElement.Text = result;
}
}
async Task<string> M2()
{
// sync portion runs on UI thread
// don't perform a lot of CPU-intensive work
// off main thread, same synchronization context - so sync part will be on UI thread.
var result = await SomeReallyAsyncMethod(...);
// sync portion runs on UI thread
// don't perform a lot of CPU-intensive work
}