Вызвать COM Interop с таймаутом - PullRequest
1 голос
/ 16 марта 2011

Мне было интересно, как этого добиться.У меня есть COM-объект, чьи операции иногда занимают много времени, кроме того, я заметил, что он имеет свое время ожидания 20 минут, если что-то пойдет не так.Это недопустимо для клиентской программы так долго ждать.

Поэтому я думаю о том, чтобы вызвать операцию COM в другом потоке, а после определенного времени ожидания просто уничтожить поток.

У меня есть помощник COMчтобы сделать вызов через отражение, которое является синхронным:

ComInvoke.Get<bool>(dcomSrv, "Launched");

это получает логическое свойство из экземпляра COM

, и я хочу обернуть это с помощью Task:

var task = Task.Factory.StartNew<bool>(() =>
            {
                return ComInvoke.Get<bool>(dcomSrv, "Launched");
            });

if (task.Wait(5000) == false)
            {
                task.Dispose();
                throw new Exception("Task timeout");
            }

Дело в том, что в задаче нет цикла, в котором я мог бы использовать токен отмены.

Как вы думаете, это хорошее решение или у вас есть что-то лучше?

Спасибо!

1 Ответ

2 голосов
/ 16 марта 2011

Task::Dispose фактически не остановит базовый поток Task и, поскольку TPL использует ThreadPool по умолчанию для планирования своей работы, эта логика будет использовать поток ThreadPool в течение полных 20 минут, в течение которых объект DCOM блокируя это. На самом деле, я уверен, что вы получите исключение, если позвоните Dispose на незавершенный Task.

Это тот случай, когда TPL, вероятно, не следует использовать, и вы просто хотите раскрутить свой собственный экземпляр Thread и просто Abort, если он не завершится в желаемое время.

...