Thread.Sleep vs WaiHandle
От: Аноним  
Дата: 24.11.10 07:07
Оценка:
Код с описанием проблемы:
var obj = new MyComObject(); // MyComObject - это СOM объект, не мой, поэтому внутреннее устройство его не знаю
obj.SomeEvent += () =>
{
   obj.Method(); // при вызове этого метода внутрях что-то блокируется, из-за этого дальше ничего не работает
};

Thread.Sleep(10000000);


Если Thread.Sleep заменяю на AutoWaitHandle.WaitOne, то все работает. Эти две конструкции по разному блокируют поток?
Re: Thread.Sleep vs WaiHandle
От: Lloyd Россия  
Дата: 24.11.10 07:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Если 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.
Re[3]: Thread.Sleep vs WaiHandle
От: Lloyd Россия  
Дата: 24.11.10 07:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>Если Thread.Sleep заменяю на AutoWaitHandle.WaitOne, то все работает. Эти две конструкции по разному блокируют поток?


L>>А кто такой AutoWaitHandle?


А>Долбаный МС-кий найминг конвеншин... AutoResetEvent, который наследник WaitHandle.


WaitOne ждет срабатывания event-а и если "повезет", то поток просыпется. Thread.Sleep-же просто засыпает поток на указанное кол-во милисекунд.
Re: Thread.Sleep vs WaiHandle
От: _d_m_  
Дата: 24.11.10 07:30
Оценка: 1 (1) +1
Здравствуйте, Аноним, Вы писали:

А>Код с описанием проблемы:

А>
А>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-же просто засыпает поток на указанное кол-во милисекунд.


Это понятно. Вопрос в способе блокирования. Почему в одному случае в обработчике события происходит блокировка, а в другом случае — нет.
Re[5]: Thread.Sleep vs WaiHandle
От: Lloyd Россия  
Дата: 24.11.10 07:34
Оценка:
Здравствуйте, Аноним, Вы писали:

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?


Как это узнать?
Re[3]: Thread.Sleep vs WaiHandle
От: _d_m_  
Дата: 24.11.10 07:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, _d_m_, Вы писали:


А>>>Если Thread.Sleep заменяю на AutoWaitHandle.WaitOne, то все работает. Эти две конструкции по разному блокируют поток?


___>>А COM объект он STA или MTA?


А>Как это узнать?


HKCR\CLSID\<CLSID твоего COM объекта>\InprocServer32\
@ThreadingModel=???
Re[3]: Thread.Sleep vs WaiHandle
От: Jolly Roger  
Дата: 24.11.10 07:49
Оценка:
Здравствуйте, Аноним, Вы писали:

Узнать можно в реестре, в регистрации этого COM-объекта по его CLSID. Но Вы-бы лучше показали более полный и реальный код, а также подробности о COM-объекте, так как изложенное Вами пока всё равно плохо согласуетмя с апартаментными моделями.
"Нормальные герои всегда идут в обход!"
Re: Thread.Sleep vs WaiHandle
От: _d_m_  
Дата: 24.11.10 08:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Код с описанием проблемы:

А>
А>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 разные стили блокировки потоков.
Re[5]: Thread.Sleep vs WaiHandle
От: _d_m_  
Дата: 24.11.10 08:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, _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 там есть?


Нет.
Re[7]: Thread.Sleep vs WaiHandle
От: _d_m_  
Дата: 24.11.10 09:26
Оценка:
Здравствуйте, Аноним, Вы писали:

___>>Ключ: InprocServer32 есть?


А>Да.


___>>Если есть, атрибут ThreadingModel там есть?


А>Нет.


Загадка. Ну открой его в "OLE/COM Object Viewer", там вкладка Implementation
Re[8]: Thread.Sleep vs WaiHandle
От: Аноним  
Дата: 24.11.10 09:55
Оценка:
Здравствуйте, _d_m_, Вы писали:

___>Загадка. Ну открой его в "OLE/COM Object Viewer", там вкладка Implementation


Both
Re[9]: Thread.Sleep vs WaiHandle
От: _d_m_  
Дата: 24.11.10 11:39
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, _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?
Re[11]: Thread.Sleep vs WaiHandle
От: k.o. Россия  
Дата: 24.11.10 12:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, _d_m_, Вы писали:


___>>3. Твой затык скорее из-за того, что объект не может вызвать событие из-за Thread.Sleep — используй примеры моего кода. Вопросы сюда.


А>Вопрос остался первоначальный. Чем блокировка потока через Sleep отличается от WaitHandle?


Вероятно, WaitHandle.WaitOne реализуется через MsgWaitForMultipleObjects, что позволяет реагировать на оконные сообщения.
Re[11]: Thread.Sleep vs WaiHandle
От: _d_m_  
Дата: 24.11.10 14:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, _d_m_, Вы писали:


___>>3. Твой затык скорее из-за того, что объект не может вызвать событие из-за Thread.Sleep — используй примеры моего кода. Вопросы сюда.


А>Вопрос остался первоначальный. Чем блокировка потока через Sleep отличается от WaitHandle?


У меня встречный вопрос: а нах тебе так это интересно? IL DASM тебе в помощь и далее другие дизассемблеры натив кода.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.