C# 调试和运行时之间的InvalidOperationException行为不同

C# 调试和运行时之间的InvalidOperationException行为不同,c#,.net-4.5,invalidoperationexception,C#,.net 4.5,Invalidoperationexception,我在WinForm应用程序中有以下代码,带有一个按钮和一个标签: private void button1_Click(object sender, EventArgs e) { Task.Run(() => label1.Text = Thread.CurrentThread.ManagedThreadId.ToString()); } 当我通过VS debugger启动程序时,label1.Text=…将抛出一个System.InvalidOperationException

我在WinForm应用程序中有以下代码,带有一个按钮和一个标签:

private void button1_Click(object sender, EventArgs e)
{
    Task.Run(() => label1.Text = Thread.CurrentThread.ManagedThreadId.ToString());
}
当我通过VS debugger启动程序时,
label1.Text=…
将抛出一个System.InvalidOperationException,因为在工作线程中访问控件。这没问题

但如果我直接运行exe,我会看到工作线程id显示在标签上,没有异常

是什么导致了这种差异

更新:
如果我在VS with release模式下启动它,则没有异常,也没有线程id。因此,这里是第三个结果。

简单地说:在release模式下,它无法可靠地检测到损坏的代码。但是:无论哪种方式,代码仍然是破碎的。您应该不要尝试从工作线程中触摸UI控件,所以:不要这样做!您确定没有禁用
控件。是否在某处检查非法的CrossThreadCalls
?(注意:您不应该禁用它;我只是问您是否禁用了)

简单地说:在发布模式下,它无法可靠地检测到损坏的代码。但是:无论哪种方式,代码仍然是破碎的。您应该不要尝试从工作线程中触摸UI控件,所以:不要这样做!您确定没有禁用
控件。是否在某处检查非法的CrossThreadCalls
?(注意:不应该禁用它;我只是问你是否禁用了它)

也许你正在运行的exe文件的旧版本不包含这行代码?@SalahAkbari非常确定exe有相同的代码,或者线程id不会显示。可能您正在运行的exe文件的旧版本不包含这行代码?@SalahAkbari非常确定exe有相同的代码,或者线程id不会显示。这是我第一次看到
控件。CheckForIllegalCrossThreadCalls
,所以我认为这不是原因。。。顺便说一句,在VS中启动释放模式是另一回事。我理解在工作线程中访问UI的危险,我刚刚发现了这一点,并想知道原因。这是我第一次看到
控件。CheckForIllegalCrossThreadCalls
,所以我认为这不是原因。。。顺便说一句,在VS中启动释放模式是另一回事。我理解在工作线程中访问UI的危险,我刚刚发现了这一点,并想知道原因。