Вопрос
Почему контейнер соединений Solrnet остается статичным? Это очень большая ошибка, как и в нашем приложении, мы отправляем асинхронную запрос в нашу приложение, Solrnet ведет себя ненормально. Как я могу избежать этой проблемы в Solrnet?
class P
{
static void M(string[] a)
{
Thread t = new Thread(delegate()
{
f1();
});
Thread t1 = new Thread(delegate()
{
f2();
});
t.Start();
t1.Start();
t.Join();
t1.Join();
}
static void f1()
{
Startup.Init<Doc>(new SolrNet.Impl.SolrPostConnection("http://localhost:8983/solr3/"));
ISolrOperations<Doc> solrOperations2 = ServiceLocator.Current.GetInstance<ISolrOperations<Document>>();
}
static void f2()
{
Startup.Init<Doc>(new SolrNet.Impl.SolrPostConnection("http://localhost:8983/solr1/"));
ISolrOperations<Doc> solrOperations2 = ServiceLocator.Current.GetInstance<ISolrOperations<Document>>();
}
}
Решение
В качестве объяснил в вики, Встроенный контейнер (запуск) в настоящее время ограничен доступа к нескольким ядрам/экземплярам с различными типами. Если вы хотите больше гибкости, переключитесь на Windsor / StructureMap / Autofac, либо Помогите реализовать эту функцию.
Регистрации в встроенном контейнере могут быть не безопасны, как вы обнаружили, но вы ничего не получаете, зарегистрировав / инициализацию Solrnet в разных потоках. Просто переместите всю инициализацию в одну потоку, фактическая тяжелая работа выполняется, когда вы выполняете Solr.Query (...) или Solr.Add (...), который является потокобезопасность.