2013-09-12 1 views
3

У меня есть небольшое приложение, которое реализует плагиновую систему на основе 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); 
    } 
} 

Мой вопрос, почему исключение поднят только в режиме отладки?

Есть ли опция, которая активна в режиме отладки, которая проверяет эту проблему с перекрестной резьбой, которая не активна в режиме деблокирования?

Я предполагаю, что проблема в этом режиме выпуска, но по какой-то причине она не появляется, потому что не проверяется.

Или я что-то упускаю?

Заранее благодарен!

+0

Я скрещивал с указанной темой, прежде чем создав этот, но думал, что это другое дело из-за названия. Извините за повторную публикацию. И спасибо за это. – Jauch

ответ

7

Эти исключения проверяются только при условии, что отладчик подключен к процессу, поэтому они не отображаются при запуске процесса без отладки (или автономно вне VS).

Это поведение можно контролировать с помощью CheckForIllegalCrossThreadCalls, статического свойства, открытого на классе Control. Я настоятельно совет против его отключить, хотя, эти исключения брошены, чтобы позволить разработчику знать что-то потенциально очень неправильно с их многопоточностью (Control -derived классов не потокобезопасные)

+0

Спасибо за объяснение. – Jauch