等待后在UI线程中运行的异步长阻塞方法

时间:2012-10-25 14:38:41

标签: c# multithreading asynchronous async-await

它的东西:

async Task foo(...)
{
   await Task.Yield();
   [long blocking I/O statements]
}

但问题是它在await之后仍然在UI线程中运行。我确保通过在等待之后为UI线程和线程获取Thread.CurrentThread.ManagedThreadId,并且UI线程变得无法响应。

那我该怎么办?我应该以传统方式使用线程而不是依赖async / await吗?或者有没有办法让它在等待之后在新的非UI线程中运行?

1 个答案:

答案 0 :(得分:4)

  

但问题是在等待之后它仍然在UI线程中运行。

是的,它会的。这是async / await的一半 - 你可以回到正确的背景。

听起来你真的启动一个新线程(或者最好使用Task<T>)进行后台操作,如果你无法避免阻塞IO。然后你可以在异步方法中使用结果:

async Task Foo(...)
{
    string result = await Task.Run(...);
    // Now update the UI with the result
}