gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:41:46 27 4
gpt4 key购买 nike

<分区>

我有一个基于 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模式中,但由于某种原因它没有出现,因为没有被检查。

还是我遗漏了什么?

提前致谢!

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com