C #: подождать определенное время при вызове внешнего метода, чтобы уведомить время ожидания - PullRequest
1 голос
/ 05 августа 2011

это мой вопрос:

Как я могу обработать тайм-аут при выполнении метода, сценарий следующий:

У меня есть приложение Windows Service для C # .Net framework 4.0. Я добавил ссылку на внешнюю COM-сборку (определенного программного обеспечения определенной компании). В этой сборке я намеревался обработать некоторую информацию о стороннем программном обеспечении в моей службе Windows и повторять эту задачу каждые X минут (определяется пользователем). Это хорошо работает в идеальном сценарии, проблема в том, что у стороннего программного обеспечения есть некоторые проблемы, эта сборка просто не отвечает, и моя служба Windows застревает при выполнении без ответа, например, это код этого выполнения:

    var calObj = new CAL.Object(CalOperatins.SendNoSavingChanges);
//this SYNC execution method sometimes get stuck and 
//the rest of the program just doesn't executes
calObj.TerminateUserSession();

log.Log4Text(string.Format("Service cycle ended, waiting {0} for next execution.",paramTime));
}

Как я уже упоминал в комментариях к коду, выполнение TerminateUserSession происходит синхронно, и если это программное обеспечение испытывает некоторую проблему, мой сервис застревает там и метод Log4Text ( и все, что ниже) не выполняется.

Есть ли способ, которым я могу обработать тайм-аут для этого TerminateUserSession выполнения метода, учитывая, что это внешняя сборка, и я не могу изменить этот код? (да, я могу понять, что это неправильно запрограммировано из-за отсутствия тайм-аута)

Заранее спасибо.

1 Ответ

3 голосов
/ 05 августа 2011

Как насчет запуска этого кода в потоке, для которого у вас есть дескриптор.Вы можете отслеживать успешное выполнение, переключая логическое значение вперед и назад и уничтожая поток, если он не отвечает в течение указанного времени ожидания.После уничтожения нити вы можете перезапустить его.Однако это не идеальное решение, вам может потребоваться воссоздать ваш COM-объект, когда вы убиваете поток, который, кажется, всегда занимает слишком много времени.

Это также зависит от того, что происходит в COM.объект и если метод TerminateUserSessions может обработать эффект.

...