【发布时间】:2016-10-06 15:44:13
【问题描述】:
我正在阅读有关 async/await 关键字的信息,并且我已经阅读过:
当逻辑流到达等待令牌时,调用线程是 暂停直到通话完成。
好吧,我创建了一个简单的windows forms application,放置了两个标签、一个按钮和一个文本框,然后我编写了代码:
private async void button1_Click(object sender, EventArgs e)
{
label1.Text = Thread.CurrentThread.ThreadState.ToString();
button1.Text = await DoWork();
label2.Text = Thread.CurrentThread.ThreadState.ToString();
}
private Task<string> DoWork()
{
return Task.Run(() => {
Thread.Sleep(10000);
return "done with work";
});
}
我不明白的是,当我点击按钮时,label1 会有文字 Running 并且标签只有在 10 秒后才会有相同的文字,但是在这 10 秒内我能够输入我的文本框中的文本,所以似乎主线程正在运行......
那么,async/await 是如何工作的?
问候
【问题讨论】:
-
@Noseratio 我在 Andrew Troelsen 的 Pro C# 5.0 和 .NET 4.5 Framework 中读到了这篇文章(第 19 章,第 746 页)
-
我刚刚开始阅读您参考的书的部分,绝对一切都是错误的。扔掉它,重新开始。
-
框架参考是MSDN;浏览网站比获取框架文档的纸质副本要好得多。对于一本关于 C# 的好书,所有标准书都很棒:
C# in Depth、Essential C#、C# in a Nutshell。我编辑了所有三个;它们是准确的。 -
太糟糕了。 “这将导致调用线程休眠”——不,它会导致工作线程休眠。 “我会把这个字符串放到一个新任务中”——不,
Run已经创建的任务会获取这个字符串。写这个东西的人只是在编造东西。这些都不对。就像作者在想“我将如何实现这个功能?”并描述了这一点,而不是描述我们实现它时的实际功能。 -
@BudaGavril:我有一篇
asyncintro 博客文章可能会对您有所帮助,我在其中尝试介绍如何在不让您不知所措的情况下思考 async/await。
标签: c# async-await thread-state