c# - 为什么仅在调试时才引发跨线程异常?

标签 c# multithreading winforms debugging mef

<分区>

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

导致问题的代码在 Changed 事件触发时调用的方法中:

public void OnUserViewPluginCatalogChanged
             (object sender, ComposablePartCatalogChangeEventArgs e)
{
    listBox1.Items.Clear();
    foreach (var item in fPluginStore.PluginsAvailable)
        listBox1.Items.Add(item.Metadata["Caption"] as string);
}

当从 UI 线程调用上述方法时,就像在 Main Form ctor 中一样,一切正常。但是只要我在插件文件夹中放置一个新插件,就会调用此方法,并且在“正常执行”(从 VS 2010 外部或通过 ctrl+F5 调用应用程序)时它似乎可以工作,显示在列表框是新插件,当使用 F5 从 VS 2010 内部调用(调试)时,它会引发异常,提示 Control 'listbox1' accessed from a thread other than the thread it was created on

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

public void OnUserViewPluginCatalogChanged
             (object sender, ComposablePartCatalogChangeEventArgs e)
{
    if( listBox1.InvokeRequired )
    {            
        this.Invoke((MethodInvoker) delegate { listBox1.Items.Clear(); });
        foreach (var item in fPluginStore.PluginsAvailable)
            this.Invoke((MethodInvoker) delegate 
                        {listBox1.Items.Add(item.Metadata["Caption"] as string);});
    }
    else
    {    
        listBox1.Items.Clear();
        foreach (var item in fPluginStore.PluginsAvailable)
           listBox1.Items.Add(item.Metadata["Caption"] as string);
    }
}

我的问题是为什么只在 Debug模式下引发异常?

是否有一个在 Debug模式下处于事件状态的选项可以检查这种在 Release模式下不活动的跨线程问题?

我假设问题出在 Release模式中,但由于某种原因它没有出现,因为没有被检查。

还是我遗漏了什么?

提前致谢!

最佳答案

只有当调试器附加到进程时才会检查这些异常,因此在运行没有调试的进程(或独立于 VS 之外)时它们不会出现。

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

关于c# - 为什么仅在调试时才引发跨线程异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18762673/

相关文章:

c# - 将 Task.Run() 用于 Linq - 优化或瓶颈

c# - 将按钮单击事件函数移动到 visual studio 中的其他类? - C#

c# - 视觉 C# : Adjust Form Size

c# - DataGridView 自动调整大小但限制最大列大小

c# - C# 扩展方法中 "this"参数的默认值

c# - Resources.Designer.cs 中的 XML 注释?

c# - 在设计时点击 "OK"窗口的 "CollectionEditor"按钮后为自定义控件添加子控件

C#:压缩 XML 给出的结果与在 JavaScript 中执行的结果不同

multithreading - 使用并行流时,Spock 单元测试卡住

java - 即使我使用异步线程,主线程也会做太多工作(UI 滞后)