Как создать Activator.CreateInstance с потоком

#vb.net #reflection #service

#vb.net #отражение #Обслуживание

Вопрос:

У меня есть некоторый код, который выполняется в многопоточном классе.
В основном я создаю много потоков, которые содержат экземпляр этого класса.

В этом классе я создаю объект либо для vb6, либо для .net dll, используя отражение, затем я вызываю метод внутри этого объекта. Вызываемый объект может каждый раз отличаться.

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

Я хочу перехватить возвращенную ошибку и поместить ее в журнал.

             If UCase(pRow("TypeVB6").ToString()) = "TRUE" Then
                classType = Type.GetTypeFromProgID(ClasstoInstantiate, True)
            Else
                classType = Type.GetType(ClasstoInstantiate, True)
            End If

            Dim o As Object = Activator.CreateInstance(classType)
            cError = classType.InvokeMember(MethodName, BindingFlags.InvokeMethod Or BindingFlags.Instance Or BindingFlags.Public, Nothing, o, New Object() {FilePath, VirtDir})
  

Ответ №1:

Пара идей для решения:

1) Убедитесь, что основная точка входа для вашего сервиса украшена атрибутом MTAThread

2) Заверните Активатор.Вызов CreateInstance (и, возможно, следующий метод InvokeMember) в инструкции SyncLock.

Комментарии:

1. я попробую это и вернусь к вам

2. синхронизация ничего не изменила

3. Какое именно исключение вы получаете?

4. я не получаю исключение, в основном оно не перемещает переданную строку кода с помощью Activator. Создавайте Activator до завершения другого потока. Итак, есть два разных потока, и они разделены вплоть до этой строки кода, тогда по какой-то причине один поток, похоже, ожидает другого.

5. Мне кажется, что объект, который вы пытаетесь создать, является однопоточным. Другая возможность заключается в том, что объект содержит что-то вроде синхронизации или мьютекса в коде запуска, чтобы предотвратить одновременный запуск нескольких экземпляров.