У меня есть небольшое приложение, которое реализует плагиновую систему на основе MEF. Динамически загружает плагины приложения, и новые плагины могут быть помещены в папку плагинов в любое время. Для этого я использую автоматическое перекомпоновку и событие «Изменено», которое возникает при появлении новых деталей. Когда доступны некоторые новые детали, я обновляю список в пользовательском интерфейсе.Почему исключение перекрестной резьбы возникает только при отладке?
Код, который вызвал проблемы был в методе вызывается, когда событие 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);
}
Когда вышеупомянутый метод вызывается из потока пользовательского интерфейса, как в главной форме CTOR, все было нормально. Но как только я поместил новый плагин в папку плагинов, этот метод будет вызываться и, хотя в «обычном исполнении» (вызов приложения извне VS 2010 или через ctrl + F5), казалось, работал, показывая в listbox новый плагин, при вызове изнутри VS 2010 с F5 (отладка), он вызвал бы исключение из bessage Control 'listbox1', доступ к которому из потока, отличного от потока, который был создан на.
Я soved эту проблему с помощью кода ниже:
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);
}
}
Мой вопрос, почему исключение поднят только в режиме отладки?
Есть ли опция, которая активна в режиме отладки, которая проверяет эту проблему с перекрестной резьбой, которая не активна в режиме деблокирования?
Я предполагаю, что проблема в этом режиме выпуска, но по какой-то причине она не появляется, потому что не проверяется.
Или я что-то упускаю?
Заранее благодарен!
Я скрещивал с указанной темой, прежде чем создав этот, но думал, что это другое дело из-за названия. Извините за повторную публикацию. И спасибо за это. – Jauch