Здравствуйте Sergey, Вы писали:
G>>Я использую интерфейс IAdviseSink для приема данных от OPC-серверов стандарта 1.0 (сервер с некоторым периодом отправляет клиенту через IAdviseSink::OnDataChange некоторые данные). Мой sink находится в многопоточном апартаменте.
S>Насколько я знаю, outgoing вызовы (события) всегда были асинхронными. В частности, в описании интерфейса IAdviseSink про это говориться: Calls to IAdviseSink methods are asynchronous, so the call is sent and then the next instruction is executed without waiting for the call's return
Да, я как то пропустил это (надо почаще в MSDN залезать)... Хорошо, что новый стандарт OPC 2.0 использует ConnectionPoint-ы, вызовы через которые синхронные.
S>На твоем месте я бы завел очередь, куда быстро укладывал бы данные, приходящие в OnDataChange, и рабочий поток, который медленно (вернее, так быстро, как только возможно
) разбирал бы очередь. Впрочем, если у тебя клиент за сервером не успевает в среднем, а не только при пиковой загрузке, все равно не поможет.
Да, отложенная обработка в моем случае проблему целиком не решит, так что пришлось пока отклонять новые входящие вызовы при превышении некоторого порога одновременно обрабатываемых. А по-хорошему надо регулировать входящий поток (типа период опроса увеличивать).
G>>P.S. Проблема обнаружилась, после того, как программа упала, когда количество потоков перевалило за тысячу.
S>Памяти под стеки потоков не хватило?
Программа не совсем падает, просто подвисает конкретно. А так вообще до 2000 потоков иногда доходило...