不期待的异步方法在UI线程上运行?

时间:2015-10-08 22:17:53

标签: c# .net multithreading asynchronous

我想要一个方法(让我们称之为 M1 )在循环中执行一些async代码(让我们称之为第二种方法 M2 )。在每次迭代时 - 应使用 M2 的结果更新UI。

为了等待 M2 M1 需要为async。但是 M1 应该在UI线程上运行(以避免竞争条件),因此将在没有await的情况下调用它。

我是否认为通过这种方式, M1 更新UI将在UI线程上?

额外:在这种情况下似乎可以async void。这是正确的吗?)

1 个答案:

答案 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
}