await仍然阻塞当前的UI线程。

14 浏览
0 Comments

await仍然阻塞当前的UI线程。

我尝试使用以下代码在线程池中运行一些任务:

private async void button1_Click(object sender, EventArgs e)
{
   await test().ConfigureAwait(continueOnCapturedContext: false);
}
private Task test()
{
   Thread.Sleep(100000);
   return null;
}

这段代码应该在线程池中运行,但当前的UI线程仍然被阻塞。

所以有人能帮忙看一下吗?

谢谢。

0
0 Comments

问题的出现原因是对于async关键字的误解,以为async会在线程池线程上运行代码,但实际上async不会在线程池线程上运行代码。

解决方法是阅读关于async的介绍和官方的async常见问题解答。在Stephen Cleary的async介绍中可以了解到async的实际作用,官方的async常见问题解答FAQ中也明确解释了关于线程池误解的问题。

0
0 Comments

问题的原因是因为在UI线程中使用了await关键字,导致UI线程被阻塞。

解决方法是使用Task.Delay方法来替代Thread.Sleep方法,以避免阻塞UI线程。

具体实现如下:

private async void button1_Click(object sender, EventArgs e)
{
   await test();
}
private Task test()
{
    return Task.Delay(100000);
}

相关问题/答案可以参考以下链接:https://stackoverflow.com/questions/13429707

0