看这段代码:
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(Windows 窗体)应用程序,这意味着只有一个线程执行每一行代码。
All BBB(data)
调用速度非常快,无需等待。
每个BBB
调用进入 BBBmethod
, sees await
它不会完成并返回(到 AAA)。
现在,当一秒(大约)过去后,所有的延续都会发生在 GUI 线程中.
Question
延续不会同时发生,因为它是 GUI 线程。
所以之前的声明:
data.Value = data.Value + 1;
一定发生过。
换句话说 ,
我知道所有BBB
s 以相同的初始值调用data
,但延续不会同时发生
GUI 线程最终必须运行:
continuation #1
MessageBox.Show(data.Value.ToString());
data.Value = data.Value + 1; //So this basically should do 0-->1
....
continuation #2
MessageBox.Show(data.Value.ToString()); // Why data.Value still "0" ??
data.Value = data.Value + 1;
....
continuation #3
MessageBox.Show(data.Value.ToString()); // Why data.Value still "0" ??
data.Value = data.Value + 1;
看起来延续不是作为一个整体而是作为共享量子来安排的?