Если вы не хотите блокировать основной поток, вы можете использовать System.Threading.Timer :
private Thread _thread;
void Main(string[] args)
{
_thread = new ThreadStart(ThreadEntry);
_thread.Start();
Timer timer = new Timer(Timeout,null,30000,Timeout.Infinite);
}
void ThreadEntry()
{
int result = obj.PerformInitTransaction();
}
void TimeOut(object state)
{
// Abort the thread - see the comments
_thread.Abort();
throw new ItTimedOutException();
}
У Джона Скита есть менее сильный способ ( отключение рабочих нитей изящно ) остановки нити, чем прерывание.
Однако, поскольку вы не контролируете операции, которые выполняет PerformInitTransaction()
, вы мало что можете сделать, если Abort завершается неудачно и оставляет объект в недопустимом состоянии. Как уже упоминалось, если вам удастся очистить все, что прервало PerformInitTransaction
, то вы можете сделать это, перехватив ThreadAbortException
, хотя, поскольку это вызов третьей стороны, это будет означать угадывание состояния, в котором вы оставили свой метод в.
PerformInitTransaction
действительно должен быть тем, который предоставляет тайм-аут.