Как устранить ошибку «В настоящее время создается другой пакет в этом ComposablePartExportProvider. Одновременно может быть составлен только один пакет».

#.net #mef

#.net #mef

Вопрос:

В моем приложении я получаю следующую ошибку, которая использует MEF:

В настоящее время создается другой пакет в этом ComposablePartExportProvider. Одновременно может быть составлен только один пакет.

Кажется, очень мало информации о том, как исправить эту ошибку, и не уверен, какую другую информацию я должен предоставить, чтобы даже заручиться некоторой помощью.

Кто-нибудь еще получал эту ошибку, используя MEF? Если да, то какими были некоторые из способов решения проблемы?

Ответ №1:

Я обнаружил, что если вы пытаетесь создавать списки экспорта в соответствии с типами импорта «на лету», container.GetExports<T>().Select(y => y.Value) работает намного лучше.

С container.ComposeParts(...) мне пришлось иметь всевозможные lock(){} блоки и другой поток для выполнения компоновки. GetExports<> похоже, от этого не страдает.

Ответ №2:

При инициализации вашего контейнера композиции установлен флаг для включения потокобезопасной опции. Как только вы включите этот, вам не понадобится никакой пользовательский механизм блокировки

 var c = new AggregateCatalog();
c.Catalogs.Add(new AssemblyCatalog("MyAssemblyName"));
var container = new CompositionContainer(c, true); // true means that it is thread safe
  

Ответ №3:

возможно, слишком много потоков используют эту функцию ComposeParts одновременно, я просто заблокировал эту функцию, потоки могут управлять этой функцией синхронно, все идет хорошо.

 class AAA{
private  static object obj=new object();
private CompositionContainer container ;
private void MefOpt()
{
    var c = new AggregateCatalog();
    c.Catalogs.Add(new AssemblyCatalog("MyAssemblyName"));
    container = new CompositionContainer(c, true);
    }
  private void CompPrt()
{
  lock(obj)
{
    container.ComposeParts(this);
}
}
  

}