【发布时间】:2015-06-02 02:09:41
【问题描述】:
我很困惑为什么这两个程序的输出不同:
private async void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 33; i++)
{
await LongProcess();
}
}
private async Task LongProcess()
{
await Task.Delay(1000);
progressBar1.Value += 3;
}
和
private async void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 33; i++)
{
await Task.Run(() => LongProcess());
}
}
private async void LongProcess()
{
await Task.Delay(1000);
progressBar1.Value += 3;
}
我意识到返回 Task 的第一个示例更正确,但我不明白为什么将 void 函数包装在 Task.Run 中不会产生相同的输出?第一个函数符合我的预期,每 1 秒更新一次进度条。第二个代码尝试一次全部更新进度条,导致尝试从多个线程更新同一个 UI 元素时出现问题。
我的假设是,由于 buttonClick 方法等待漫长的过程完成,所以两组代码都不应允许 progressBar1 更新,直到前一个过程完成。为什么第二组代码允许它一次发生?
【问题讨论】:
标签: c# asynchronous async-await