【发布时间】:2016-06-13 22:28:50
【问题描述】:
我想在单独的线程中处理长时间运行的操作,并使用 async/await 模式尽快将控制权返回给 GUI 线程,如下所示:
private async void Button_Click(object sender, RoutedEventArgs e)
{
await Test();
txtResult.Text = "Done!";
}
private Task Test()
{
Thread.Sleep(3000);
return Task.FromResult(0);
}
问题是,它无论如何都会冻结 GUI 3 秒(它变得无响应,直到完成!在 3 秒后显示)。我做错了什么?
编辑: 我正在尝试替换以下逻辑:
private void Button_Click(object sender, RoutedEventArgs e)
{
var thread = new Thread(() => Test(Callback));
thread.Start();
}
private void Callback()
{
Dispatcher.Invoke(() =>
txtResult.Text = "Done!");
}
private void Test(Action callback)
{
Thread.Sleep(3000); //long running operation, not necessarily pause
callback();
}
在实际项目中,我有不同的长时间运行逻辑,而不仅仅是睡眠,它仍然冻结 GUI,所以用 Task.Delay 替换它并不能解决任何问题。此外,我不明白你为什么要使用另一个睡眠命令? async/await 设计是如何要求的?
【问题讨论】:
-
异步不会导致您的代码在单独的线程上运行。它允许当前线程在用于创建要在另一个线程上运行的任务或执行要等待的 IO 绑定任务的代码上时不被阻塞。但是,您的方法不会做这些事情。
标签: c# user-interface asynchronous async-await