#.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);
}
}
}