【发布时间】:2015-10-09 10:20:36
【问题描述】:
在询问this question 并看到我完全误解了这个概念后,我一直在阅读有关Tasks 的信息。诸如置顶答案here 和here 之类的答案解释了idea,但我还是不明白。
所以我提出了一个非常具体的问题:在执行任务时,CPU 上实际发生了什么?
这是我在阅读后所理解的:任务将与调用者共享 CPU 时间(假设调用者是“UI”),因此如果它是 CPU 密集型的 - 它会减慢 UI。如果任务不是 CPU 密集型 - 它将在“后台”运行。看起来很清楚……直到经过测试。下面的代码应该允许用户点击按钮,然后交替显示“Shown”和“Button”。但实际上:在“已显示”全部显示之前,表单一直处于忙碌状态(-不可能有用户输入)。
public Form1()
{
InitializeComponent();
Shown += Form1_Shown;
}
private async void Form1_Shown(object sender, EventArgs e)
{
await Doit("Shown");
}
private async Task Doit(string s)
{
WebClient client = new WebClient();
for (int i = 0; i < 10; i++)
{
client.DownloadData(uri);//This is here in order to delay the Text writing without much CPU use.
textBox1.Text += s + "\r\n";
this.Update();//textBox1.
}
}
private async void button1_Click(object sender, EventArgs e)
{
await Doit("Button");
}
有人可以告诉我在执行任务时 CPU 上实际发生了什么(例如“当 CPU 不被 UI 使用时,任务会使用它,除非……等”)?
【问题讨论】:
-
Doit同步运行。将方法标记为async Task不会使其本身异步。事实上,我希望你看到一个编译警告,说明你有一个不等待的异步方法。 -
@DanielKelley 好的。那么我如何do让它异步运行呢?当然,除了使用
DownloadDataAsync,这违背了这个测试的目的,因为我想创建自己的异步任务。 -
好吧,在这种情况下,您应该等待异步的 DownloadDataAsync。 DownloadData 是同步的,因此会阻塞。
-
或者您可以使用
Task.Run并等待它。 -
@EmpereurAiman 当有可用的异步选项时,这没有意义。它会不必要地在线程池线程上运行代码。
标签: c# .net multithreading asynchronous async-await