#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. Мне кажется, что объект, который вы пытаетесь создать, является однопоточным. Другая возможность заключается в том, что объект содержит что-то вроде синхронизации или мьютекса в коде запуска, чтобы предотвратить одновременный запуск нескольких экземпляров.