为什么在使用任务时,使用 F5 和 Ctrl+F5 运行 WindowsForm 应用会导致不同的行为?



我有一个简单的Windows Form App with C#使用VS 2019。当我使用 F5 运行应用程序时,我遇到异常

"System.InvalidOperationException: '跨线程操作无效:控制'richTextBox1'从创建它的线程以外的线程访问。

但是当我使用 Ctrl+F5 时,一切正常。 谁能解释我为什么?

这是我的代码:

private async void button1_Click(object sender, EventArgs e)
{
Task.Run(() =>
{
for (int i = 0; i < 500; i++)
{
Thread.Sleep(1000);
richTextBox1.Text += string.Format("n Row No: {0}", (i + 1));
}
});
Task.Run(() =>
{
for (int i = 0; i < 500; i++)
{
Thread.Sleep(1000);
richTextBox2.Text += string.Format("n Row No: {0}", (i + 1));
}
});
}

使用 Ctrl+F5 时,无需调试器即可启动。如果未附加调试器,.net 代码不会引发异常。但是,仅仅因为没有抛出错误并不意味着您应该这样做。它仍然是您应该修复的代码中的错误。

如果您感到好奇,"正确的方法"是不要使用Task.Run,而只是使用异步方法。

private async void button1_Click(object sender, EventArgs e)
{
Task task1 = UpdateTextBox1();
Task task2 = UpdateTextBox2();
await Task.WhenAll(task1, task2);
}
private async Task UpdateTextBox1()
{
for (int i = 0; i < 500; i++)
{
await Task.Delay(1000);
richTextBox1.Text += string.Format("n Row No: {0}", (i + 1));
}
});
private async Task UpdateTextBox2()
{
for (int i = 0; i < 500; i++)
{
await Task.Delay(1000);
richTextBox2.Text += string.Format("n Row No: {0}", (i + 1));
}
}

最新更新