Я должен добавить к уже упомянутым другим комментаторам, которые ждут, как
while (!_timedOut && !_comCallSuccessful) { }
неправильно, так как он заставляет ваш процессор тупо тратить свои циклы.
Вам лучше использовать System.Threading.EventWaitHandle:
EventwaitHandle _comCallSuccessful = new ManualResetEvent(false);
EventwaitHandle _timedOut = new ManualResetEvent(false);
private void MakeACOMCallThatCouldTakeALongTime() {
Thread.Sleep(2500);
_comCallSuccessful.Set();
}
private void CheckForOneSecondTimeOut() {
Thread.Sleep(1000);
_timedOut.Set();
}
private void ThreadTester() {
/* thread starting*/
var handles = new WaitHandle[]{_comCallSuccessful, _timedOut};
int indexFirstSet = Waithandle.WaitAny(handles);
if (indexFirstSet == 0) // _comCallSuccessful
{
Console.WriteLine("Finished!");
}
else
{
t1.Abort();
Console.WriteLine("Timed out!");
}
}
Если вам ничего не нужно делать в основном потоке, вы можете запустить только один поток и использовать _comCallSuccessful.WaitOne (timeout), который возвращает true, если событие было Set () до истечения времени ожидания.
И в любом случае, вам лучше иметь явный способ отменить операцию в вашем сервисе (например, метод COM-объекта)