C# 为什么只有在调试时才会引发跨线程异常?

C# 为什么只有在调试时才会引发跨线程异常?,c#,multithreading,winforms,debugging,mef,C#,Multithreading,Winforms,Debugging,Mef,我有一个小应用程序,它实现了一个基于MEF的插件系统。 应用程序动态加载插件,并且可以随时将新插件放在plugins文件夹中。 为了实现这一点,我使用了自动重新编译和事件更改,当新零件可用时会引发事件。 当某些新部件可用时,我会更新UI中的列表框 引发更改事件时调用的方法中存在导致问题的代码: 已更改服务wPluginCatalog上的公共无效 (对象发送方,ComposablePartCatalogChangeEventArgs e) { listBox1.Items.Clear(); for

我有一个小应用程序,它实现了一个基于MEF的插件系统。 应用程序动态加载插件,并且可以随时将新插件放在plugins文件夹中。 为了实现这一点,我使用了自动重新编译和事件更改,当新零件可用时会引发事件。 当某些新部件可用时,我会更新UI中的列表框

引发更改事件时调用的方法中存在导致问题的代码:

已更改服务wPluginCatalog上的公共无效 (对象发送方,ComposablePartCatalogChangeEventArgs e) { listBox1.Items.Clear(); foreach(fPluginStore.PluginsAvailable中的var项) listBox1.Items.Add(item.Metadata[“Caption”]作为字符串); } 当从UI线程调用上述方法时,就像在主窗体中一样,一切都正常。但是,一旦我将一个新插件放在plugins文件夹中,就会调用这个方法,而在“正常执行”(从VS 2010外部调用应用程序或通过ctrl+F5)时,它似乎可以工作,当使用F5(调试)从VS 2010内部调用时,会在列表框中显示新插件,它将引发一个异常,bessage控件“listbox1”是从创建它的线程以外的线程访问的

我通过下面的代码解决了这个问题:

已更改服务wPluginCatalog上的公共无效 (对象发送方,ComposablePartCatalogChangeEventArgs e) { 如果(listBox1.InvokeRequired) { this.Invoke((MethodInvoker)委托{listBox1.Items.Clear();}); foreach(fPluginStore.PluginsAvailable中的var项) 此.Invoke((MethodInvoker)委托 {listBox1.Items.Add(item.Metadata[“Caption”]作为字符串);}); } 其他的 { listBox1.Items.Clear(); foreach(fPluginStore.PluginsAvailable中的var项) listBox1.Items.Add(item.Metadata[“Caption”]作为字符串); } } 我的问题是,为什么只有在调试模式下才会引发异常

是否有一个选项在调试模式下处于活动状态,用于检查在发布模式下未处于活动状态的此类跨线程问题

我假设问题在发布模式中,但由于某种原因,它没有显示出来,因为没有被检查

还是我遗漏了什么


提前谢谢

只有当调试器连接到进程时,才会检查这些异常,因此在未进行调试(或在VS之外独立运行)的情况下运行进程时不会显示这些异常


可以通过
控件
类上公开的静态属性来控制此行为。不过,我强烈建议不要禁用它,抛出这些异常是为了让开发人员知道他们的多线程可能存在严重错误(
Control
-派生类不是线程安全的)

在创建此线程之前,我与前面提到的线程交叉,但由于标题的原因,我认为这是另一回事。对不起,邮件重复了。谢谢你指出,谢谢你的解释。