2012-10-25 42 views
0

它的东西之后,在UI线程中运行。我确定通过在等待之后为UI线程和线程获取Thread.CurrentThread.ManagedThreadId,并且UI线程变得无法响应。异步长阻塞方法等待周围

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

+0

你可以用你的“长阻塞I/O语句”到另一个awaitable,任务,方法返回并等待呢? – n8wrl

回答

4

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

是的,它会。这是async/await整点的一半 - 您可以回到正确的上下文中。

这听起来像你真的应该开始一个新的线程(或最好是,使用Task<T>)的后台操作,如果你无法避免阻塞IO。然后你可以使用导致异步方法:

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

我试过,它工作,但我更新该线程的UI元素(将项目添加到列表视图),现在“调用线程无法访问此对象,因为不同的线程拥有它。”抛出异常。 – xander

+0

我通过在UI更新代码之前添加this.Dispatcher.Invoke((Action)((=)=>修复了UI更新异常,希望我今天没有更多的惊喜 – xander

+0

@xander:你为什么不这么做根据我的建议?只*在另一个线程中同步位,并在完成那一点时返回到UI线程当然,您可以使用Dispatcher.Invoke,但目标是为异步/等待在大多数情况下使这种情况变得不必要。 –