Wenn Sie nicht möchten, dass der Haupt-Thread blockieren Sie eine System.Threading.Timer verwenden:
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();
}
Jon Skeet hat eine weniger gewaltsame Weise (Shutting Down Worker Threads Gracefully) des Anhaltens der Faden als zunichte machen.
Da Sie jedoch nicht die Kontrolle über die Operationen PerformInitTransaction()
haben, gibt es nicht viel, was Sie tun können, wenn der Abbruch fehlschlägt und das Objekt in einem ungültigen Zustand belässt. Wie bereits erwähnt, wenn Sie in der Lage sind, alles zu bereinigen, das die PerformInitTransaction
abgebrochen hat, können Sie dies tun, indem Sie die ThreadAbortException
fangen, obwohl es ein Anruf von Drittanbietern ist, bedeutet es den Zustand zu erraten, in dem Sie ihre Methode verlassen haben.
Die PerformInitTransaction
sollte wirklich diejenige sein, die das Timeout liefert.
@Bomboca: Ich rollte deine Bearbeitung zurück, die 'Exception' Ich werfe nicht ein' ThreadAbortException', die etwas von der CLR geworfen ist sollte ein Anruf, wenn zu "Abort" wird gemacht. –
Entschuldigung dafür und danke für die Eingabe :) –
Es ist ein blockierender Anruf, wenn Sie den Haupt-Thread andere Dinge zu dieser Zeit brauchen, wird dies nicht funktionieren! – feldeOne