【发布时间】:2015-03-16 13:04:38
【问题描述】:
我已经阅读(并使用过)async/await 有一段时间了,但我仍然有一个问题无法回答。假设我有这个代码。
private async void workAsyncBtn_Click(object sender, EventArgs e)
{
var myTask = _asyncAwaitExcamples.DoHeavyWorkAsync(5);
await myTask;
statusTextBox.Text += "\r\n DoHeavyWorkAsync message";
}
从 UI 线程调用并返回到 UI 线程。因此,我可以在此方法中和await myTask 之后执行特定于 UI 的操作。如果我使用了.ConfigureAwait(false),我会在执行statusTextBox.Text += "\r\n DoHeavyWorkAsync message"; 时遇到线程异常,因为我会告诉myTask,可以从线程池中获取任何可用线程。
我的问题。据我了解,在这种情况下我永远不会离开 UI 线程,它仍然是异步运行的,UI 仍然是响应式的,我可以同时启动多个任务,从而加快我的应用程序。如果我们只使用一个线程,这将如何工作?
谢谢!
为 Sievajet 编辑
private async void workAsyncBtn_Click(object sender, EventArgs e)
{
await DoAsync();
}
private async Task DoAsync()
{
await Task.Delay(200);
statusTextBox.Text += "Call to form";
await Task.Delay(200);
}
【问题讨论】:
-
您是在说将工作编组回 UI 线程吗?
-
我现在看到这个问题并不像我想象的那么具体,它可以用不同的方式来解释。阅读您的答案@YuvalItzchakov 后,我更好地理解了,在阅读了 Sievajet 的答案后,我发现当没有异步 IO 绑定操作时还有另一个答案。
-
@Andreas 我看到您添加了另一个示例,它仍然有效,因为:没有涉及线程。您是否按照 Yuval 的建议阅读了 blog.stephencleary.com/2013/11/there-is-no-thread.html?
-
@Krumelur 是的,我做到了,当您指出这一点时,它现在非常有意义。目前大量阅读。大脑无处不在。谢谢!
-
要了解更多关于
async-await的信息,请阅读myasync-awaitcuration上的文章。
标签: c# .net asynchronous async-await threadpool