它的东西:
async Task foo(...)
{
await Task.Yield();
[long blocking I/O statements]
}
但问题是它在await之后仍然在UI线程中运行。我确保通过在等待之后为UI线程和线程获取Thread.CurrentThread.ManagedThreadId,并且UI线程变得无法响应。
那我该怎么办?我应该以传统方式使用线程而不是依赖async / await吗?或者有没有办法让它在等待之后在新的非UI线程中运行?
答案 0 :(得分:4)
但问题是在等待之后它仍然在UI线程中运行。
是的,它会的。这是async
/ await
的一半 - 你可以回到正确的背景。
听起来你真的应启动一个新线程(或者最好使用Task<T>
)进行后台操作,如果你无法避免阻塞IO。然后你可以在异步方法中使用结果:
async Task Foo(...)
{
string result = await Task.Run(...);
// Now update the UI with the result
}