Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > InvokeMember и многопоточность


Автор: Wanderer2019 6.7.2007, 16:18
Предыдущую тему можно удалять... 
В чем проблема разобрался...

Задача: Обработать большой файл Excel и записать данные в какое то хранилище.

Решение:
Для работы с файлом выбрал метод позднего связывания. т.е. вытаскиваю данные об объектах через 

Код

TheType.InvokeMember("PropertyName",BindingFlags.GetProperty, null, Instance, null)


Для обработки файла написал рекурсивную функцию, которую вызываю в потоке. Чтобы передать в функцию параметры использую глобальные переменные. И рекурсивню вызываю из обычной...
т.е. получается что то вроде такого:
Код

class test{
int param;

private void ThreadStartedFunction(){
RecurseFunction(param);
}

private int RecurseFunction(int test){}


}


В процессе выполнения поток вызывается и зависает на строчке:
Код

TheType.InvokeMember("PropertyName",BindingFlags.GetProperty, null, Instance, null)


С чем может быть проблемма??? Как InvokeMember конфликтует с тем, что функция запускается из потока?


Автор: tol05 6.7.2007, 16:42
Во-первых, рефлексия сама по себе - времязатратная вещь. Как-никак - манифест парсится каждый раз...
Во-вторых, где вызывается 
Код

TheType.InvokeMember("PropertyName",BindingFlags.GetProperty, null, Instance, null)

в рекурсии? Какая связь между 
Цитата(Wanderer2019 @  6.7.2007,  16:18 Найти цитируемый пост)
Для обработки файла написал рекурсивную функцию, которую вызываю в потоке. Чтобы передать в функцию параметры использую глобальные переменные. И рекурсивню вызываю из обычной...

и 
Код

TheType.InvokeMember("PropertyName",BindingFlags.GetProperty, null, Instance, null)

?
И покажи декларацию PropertyName, лучше всего Instance 
smile

Автор: mr.DUDA 6.7.2007, 20:36
Может "виснуть" (вылетать, на самом деле) из-за необработанного исключения в Invoke. Не мешало бы завернуть InvokeMember в блок try..catch и глянуть что там получается.

Автор: Wanderer2019 6.7.2007, 22:45
mr.DUDA
ну вот в чем и проблема, что не используя многопоточность все работает отлично... как только засовываю в поток виснет при первом же обращении к Invoke. 

Автор: mr.DUDA 9.7.2007, 17:39
А в отладке посмотреть ? В конце концов, можно приаттачиться к процессу и нажать Pause Debug - в Threads покажет где находится каждый поток.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)