我不是在问问题,而是在讨论 C# 编译器中的错误/错误。
// do a heavy job it take 2s and return "1"
public async Task<string> DoJob() {
var task = new Task<string>(() => {
Thread.Sleep(2000);
return "1";
});
task.Start();
return await task;
}
private async void button1_Click(object sender, EventArgs e) {
var task= DoJob();
textBox1.Text += await task;
this.Text += "2";
}
当我点击 button1 3 次时,我期望:
textBox1.Text == "111"
this.Text == "222"
但结果是:
textBox1.Text == "1"
this.Text == "222"
还有另一个错误,在等待 2 秒(在 2 秒之前)时,我通过输入键盘更改了 textBox1.Text,但结果仍然相同“1”,而不是附加到文本末尾(+= 运算符)。
根据我的知识 async 和 await 是关键字什么都不做,只是帮助编译器知道将代码放入块的位置(纠正我):
例子
输入:
private async void button1_Click(object sender, EventArgs e) {
var task= DoJob();
textBox1.Text += await task;
this.Text += "2";
}
输出:这给出了我期望的结果,但与 C# 编译器不同。而且这也没有上面还有一个bug。
private void button1_Click(object sender, EventArgs e) {
var task= DoJob();
task.ContinueWith((_task) => {
this.Invoke(new Action(() => {
textBox1.Text += _task.Result;
this.Text += "2";
}));
});
}
但是 MS C# 编译器会做这样的事情:
private void button1_Click(object sender, EventArgs e) {
var task = DoJob();
var left = textBox1.Text;
task.ContinueWith((_task) => { // textBox1.Text += await task;
this.Invoke(new Action(() => { //
textBox1.Text = left + _task.Result; //
this.Text += "2"; // this.Text += "2";
}));
});
}
您认为这是错误还是微软故意这样做?
阿波罗的战车
慕仙森
呼唤远方
相关分类