- 此问题在此处已有答案**:
Why is cross thread operation exception not thrown while running exe in bin\Debug(1个答案)
六年前关闭了。
据我所知,如果访问UI控件的线程不是创建它的线程(UI线程),则访问UI控件将引发异常。
我得到了一个代码,当在Visual Studio中使用调试器运行时,访问UI控件的简单属性时不会引发异常。
var name = comboBox1.Name;
var m1 = comboBox1.Items[1].ToString();
它在访问ComboBox的SelectedIndex时执行。
comboBox1.SelectedItem.ToString();
同样的代码在没有调试器的情况下运行不会抛出异常?同样的行为是双击exe时,不会有异常?
为什么只有在附加调试器的情况下运行代码时才有异常,而在不使用调试器的情况下运行代码时(Ctrl + F5)没有异常?
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
comboBox1.Items.Add("one");
comboBox1.Items.Add("two");
comboBox1.Items.Add("three");
}
private void button2_Click(object sender, EventArgs e)
{
Task.Factory.StartNew(() =>
{
var name = comboBox1.Name;
var m1 = comboBox1.Items[1].ToString();
MessageBox.Show(comboBox1.SelectedItem.ToString(), "MM");
});
}
}
3条答案
按热度按时间j5fpnvbx1#
它在调试器中可靠地发生,因为Visual Studio“足够聪明”,能够看到错误并强制它总是发生,以防止运行时出现神秘的间歇性错误。这是Visual Studio附带的许多
Managed Debug Assistants
之一。它可以通过将间歇性错误转换为一致性错误来帮助您查找间歇性错误。基本上,从另一个线程访问UI控件总是错误的,但Windows并不总是抛出错误,有时它会继续没有任何问题。
MDA
在调试时是活动的。它专门监视跨线程访问UI,并确保错误总是发生。u2nhd7ah2#
你可能最终会看到一个异常在调试器之外运行。记住,由于附加断点等原因,当线程相互交互时,调试器可能会发生变化。
这只是一个概率问题--附加调试器会改变执行特性,因此在您的情况下,您更有可能看到线程以有问题的方式交互,反之亦然。
特别是因为你使用的是Task API(它不一定会为每个后台执行生成一个新线程),所以在大多数情况下你甚至可能不生成一个新线程(如果你好奇这是如何工作的,你可以看看“工作窃取算法”)
b5buobof3#
https://msdn.microsoft.com/en-us/library/ms171728.aspx
此异常在调试期间可靠地发生,在某些情况下,在运行时也会发生。
因此,我的用例不在:在某些情况下,在运行时