var obj = new MyComObject(); // MyComObject - это СOM объект, не мой, поэтому внутреннее устройство его не знаю
obj.SomeEvent += () =>
{
obj.Method(); // при вызове этого метода внутрях что-то блокируется, из-за этого дальше ничего не работает
};
Thread.Sleep(10000000);
Если Thread.Sleep заменяю на AutoWaitHandle.WaitOne, то все работает. Эти две конструкции по разному блокируют поток?
Здравствуйте, Аноним, Вы писали:
А>Если Thread.Sleep заменяю на AutoWaitHandle.WaitOne, то все работает. Эти две конструкции по разному блокируют поток?
А кто такой AutoWaitHandle?
Re[2]: Thread.Sleep vs WaiHandle
От:
Аноним
Дата:
24.11.10 07:24
Оценка:
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Аноним, Вы писали:
А>>Если Thread.Sleep заменяю на AutoWaitHandle.WaitOne, то все работает. Эти две конструкции по разному блокируют поток?
L>А кто такой AutoWaitHandle?
Долбаный МС-кий найминг конвеншин... AutoResetEvent, который наследник WaitHandle.
Здравствуйте, Аноним, Вы писали:
А>>>Если Thread.Sleep заменяю на AutoWaitHandle.WaitOne, то все работает. Эти две конструкции по разному блокируют поток?
L>>А кто такой AutoWaitHandle?
А>Долбаный МС-кий найминг конвеншин... AutoResetEvent, который наследник WaitHandle.
WaitOne ждет срабатывания event-а и если "повезет", то поток просыпется. Thread.Sleep-же просто засыпает поток на указанное кол-во милисекунд.
Здравствуйте, Аноним, Вы писали:
А>Код с описанием проблемы: А>
А>var obj = new MyComObject(); // MyComObject - это СOM объект, не мой, поэтому внутреннее устройство его не знаю
А>obj.SomeEvent += () =>
А>{
А> obj.Method(); // при вызове этого метода внутрях что-то блокируется, из-за этого дальше ничего не работает
А>};
А>Thread.Sleep(10000000);
А>
А>Если Thread.Sleep заменяю на AutoWaitHandle.WaitOne, то все работает. Эти две конструкции по разному блокируют поток?
А COM объект он STA или MTA?
Re[4]: Thread.Sleep vs WaiHandle
От:
Аноним
Дата:
24.11.10 07:30
Оценка:
Здравствуйте, Lloyd, Вы писали:
L>WaitOne ждет срабатывания event-а и если "повезет", то поток просыпется. Thread.Sleep-же просто засыпает поток на указанное кол-во милисекунд.
Это понятно. Вопрос в способе блокирования. Почему в одному случае в обработчике события происходит блокировка, а в другом случае — нет.
Здравствуйте, Аноним, Вы писали:
L>>WaitOne ждет срабатывания event-а и если "повезет", то поток просыпется. Thread.Sleep-же просто засыпает поток на указанное кол-во милисекунд.
А>Это понятно. Вопрос в способе блокирования. Почему в одному случае в обработчике события происходит блокировка, а в другом случае — нет.
Похоже, _d_m_ на более правилном пути. Уступаю ему слово.
Re[2]: Thread.Sleep vs WaiHandle
От:
Аноним
Дата:
24.11.10 07:37
Оценка:
Здравствуйте, _d_m_, Вы писали:
А>>Если Thread.Sleep заменяю на AutoWaitHandle.WaitOne, то все работает. Эти две конструкции по разному блокируют поток?
___>А COM объект он STA или MTA?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, _d_m_, Вы писали:
А>>>Если Thread.Sleep заменяю на AutoWaitHandle.WaitOne, то все работает. Эти две конструкции по разному блокируют поток?
___>>А COM объект он STA или MTA?
А>Как это узнать?
HKCR\CLSID\<CLSID твоего COM объекта>\InprocServer32\
@ThreadingModel=???
Узнать можно в реестре, в регистрации этого COM-объекта по его CLSID. Но Вы-бы лучше показали более полный и реальный код, а также подробности о COM-объекте, так как изложенное Вами пока всё равно плохо согласуетмя с апартаментными моделями.
Здравствуйте, Аноним, Вы писали:
А>Код с описанием проблемы: А>
А>var obj = new MyComObject(); // MyComObject - это СOM объект, не мой, поэтому внутреннее устройство его не знаю
А>obj.SomeEvent += () =>
А>{
А> obj.Method(); // при вызове этого метода внутрях что-то блокируется, из-за этого дальше ничего не работает
А>};
А>Thread.Sleep(10000000);
А>
А>Если Thread.Sleep заменяю на AutoWaitHandle.WaitOne, то все работает. Эти две конструкции по разному блокируют поток?
Вобще с COM-ом надо внимательно быть по поводу потоков. Я в этом вопросе собак наелся. Если что — помогу.
Мой телепатический мозг улавливает эманнации твоего кода, выстрел навскидку:
[STAThread]
static void Main(string[] args)
{
...
var obj = new MyComObject(); // MyComObject - это СOM объект, не мой, поэтому внутреннее устройство его не знаю
obj.SomeEvent += () =>
{
obj.Method();
};
Application.Run(); // запуск очереди сообщений
...
}
или более правильно
static void Main(string[] args)
{
...
var MyThread = new Thread((ThreadStart)delegate
{
var obj = new MyComObject(); // MyComObject - это СOM объект, не мой, поэтому внутреннее устройство его не знаю
obj.SomeEvent += () =>
{
obj.Method();
};
Application.Run(); // запуск очереди сообщений
});
MyThread.SetApartmentState(ApartmentState.STA);
MyThread.Start();
Console.WriteLine("Жми ENTER для выхода...");
Console.ReadLine();
Application.Exit();
}
PS: Как ты будешь отписывать анонимный делегат?
Re[4]: Thread.Sleep vs WaiHandle
От:
Аноним
Дата:
24.11.10 08:12
Оценка:
Здравствуйте, _d_m_, Вы писали:
___>HKCR\CLSID\<CLSID твоего COM объекта>\InprocServer32\ ___>@ThreadingModel=???
У меня ветка оказалось чутка другой (видимо из-за 64 битности). HKEY_CLASSES_ROOT\Wow6432Node\CLSID\
Там нет такого ключа.
Да, еще такая детать (судя по ответам дальше). Хост — юнит тест, запускаю через R# TaskLoader. Это не WPF и не консоль... Хотя это все не так важно. Важно другое — почему у Thread.Sleep и WaitHandle разные стили блокировки потоков.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, _d_m_, Вы писали:
___>>HKCR\CLSID\<CLSID твоего COM объекта>\InprocServer32\ ___>>@ThreadingModel=???
А>У меня ветка оказалось чутка другой (видимо из-за 64 битности). HKEY_CLASSES_ROOT\Wow6432Node\CLSID\
А>Там нет такого ключа.
Ключ: InprocServer32 есть? Если есть, атрибут ThreadingModel там есть?
Re[6]: Thread.Sleep vs WaiHandle
От:
Аноним
Дата:
24.11.10 08:39
Оценка:
Здравствуйте, _d_m_, Вы писали:
___>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, _d_m_, Вы писали:
___>>>HKCR\CLSID\<CLSID твоего COM объекта>\InprocServer32\ ___>>>@ThreadingModel=???
А>>У меня ветка оказалось чутка другой (видимо из-за 64 битности). HKEY_CLASSES_ROOT\Wow6432Node\CLSID\
А>>Там нет такого ключа.
___>Ключ: InprocServer32 есть?
Да.
___>Если есть, атрибут ThreadingModel там есть?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, _d_m_, Вы писали:
___>>Загадка. Ну открой его в "OLE/COM Object Viewer", там вкладка Implementation
А>Both
Ага, понятно. Значит обе. НО...
1. Не факт, что разрабы не накосячили, и объект будет работать в MTA.
2. В STA он будет работать. Ты ж не создаешь множество объектов, где критично STA-MTA?
3. Твой затык скорее из-за того, что объект не может вызвать событие из-за Thread.Sleep — используй примеры моего кода. Вопросы сюда.
Re[10]: Thread.Sleep vs WaiHandle
От:
Аноним
Дата:
24.11.10 11:59
Оценка:
Здравствуйте, _d_m_, Вы писали:
___>3. Твой затык скорее из-за того, что объект не может вызвать событие из-за Thread.Sleep — используй примеры моего кода. Вопросы сюда.
Вопрос остался первоначальный. Чем блокировка потока через Sleep отличается от WaitHandle?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, _d_m_, Вы писали:
___>>3. Твой затык скорее из-за того, что объект не может вызвать событие из-за Thread.Sleep — используй примеры моего кода. Вопросы сюда.
А>Вопрос остался первоначальный. Чем блокировка потока через Sleep отличается от WaitHandle?
Вероятно, WaitHandle.WaitOne реализуется через MsgWaitForMultipleObjects, что позволяет реагировать на оконные сообщения.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, _d_m_, Вы писали:
___>>3. Твой затык скорее из-за того, что объект не может вызвать событие из-за Thread.Sleep — используй примеры моего кода. Вопросы сюда.
А>Вопрос остался первоначальный. Чем блокировка потока через Sleep отличается от WaitHandle?
У меня встречный вопрос: а нах тебе так это интересно? IL DASM тебе в помощь и далее другие дизассемблеры натив кода.