<分区>
我有一个基于 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模式中,但由于某种原因它没有出现,因为没有被检查。
还是我遗漏了什么?
提前致谢!