后不更新寻找在这个代码:值异步方法恢复
public class SharedData
{
public int Value { get; set; }
}
void button1_Click(object sender, EventArgs e)
{
AAA();
}
async Task BBB(SharedData data)
{
await Task.Delay(TimeSpan.FromSeconds(1));
MessageBox.Show(data.Value.ToString()); //<---- I always see 0 here,
data.Value = data.Value + 1;
}
async Task<int> AAA()
{
SharedData data = new SharedData();
var task1 = BBB(data);
var task2 = BBB(data);
var task3 = BBB(data);
await Task.WhenAll(task1, task2, task3);
MessageBox.Show(data.Value.ToString()); //<--- this does show 3
return data.Value;
}
这是一个GUI(窗口形式)应用程序,这意味着只有一个执行的代码的每一行线程。
全部BBB(data)
调用非常快速地调用,无需等待。 每个BBB
调用进入BBB method
,看到await
不完成并返回(到AAA)。
现在,当一秒(大约)已过时,在GUI线程中所有延续发生。
问题
延续,因为它是一个GUI线程不会同时发生。 因此,以前的声明:
data.Value = data.Value + 1;
必须发生。
换句话说,
我知道,所有BBB
s的与data
相同的初始值调用,但延续不会发生同时
GUI线程必须最终运行:
延续#1
MessageBox.Show(data.Value.ToString());
data.Value = data.Value + 1; //So this basically should do 0-->1
....
延续#2
MessageBox.Show(data.Value.ToString()); // Why data.Value still "0" ??
data.Value = data.Value + 1;
....
延续#3
MessageBox.Show(data.Value.ToString()); // Why data.Value still "0" ??
data.Value = data.Value + 1;
它看起来像延续预计不会作为一个整体,但作为共享量子?
@Eser我不明白,每次延续了自己的gui线程。这里有**没有**其他线程。为什么锁定?这不是(!)在线程池线程中运行,这意味着没有上下文可以保留(并且每个延续可以在另一个线程池线程中运行)。 –
更改'BBB'以接受并使用延迟值:'异步任务BBB SharedData data,int delay)',然后传递不同的值而不是相同的'1'。想知道为什么现在你一次看到三个消息框,而不是一次一个? :) – Noseratio
@Noseratio是的,我不知道:-)你能解释一下吗? [此代码](http://i.imgur.com/pWUXCXW.png)一起显示3 MSgBox,而不是1(如我的示例中)。你能解释为什么吗? –