Timeout für Verfahren auf UI-Thread
-
03-07-2019 - |
Frage
Ich habe das Problem, dass ich ein Objekt auf dem UI-Thread bin Instanziierung (WinForms). Diese Aufgabe Schöpfung wahrscheinlich dauert sehr lange, und ich möchte so etwas wie ein „Timeout“ haben, für diese Methode (weil es meine App zu blockieren).
Die Probleme, die ich habe, sind: 1. muss das Objekt auf dem UI-Thread erstellt werden 2. das Objekt ein Fremdkörper, und ich habe keine Quelle Zugriff, also kann ich es nicht ändern.
So mir Frage wäre, wenn jemand eine kreative Idee hat, wenn es möglich ist, eine Logik zu schaffen, das das Verfahren stoppt für geführt wurde, wenn ein Timeout erreicht ist?
tia Martin
Lösung
Hier ist eine schlechte Lösung. Verwenden, um einen Arbeiter-Thread auf einem Zeitgeber, um den UI-Thread zu überwachen. Wenn der Zeitgeber abläuft, bevor das Objekt erstellt wird, muss die Arbeiter-Thread Anruf Abort
auf dem UI-Thread. Dies wird eine ThreadAbortException
in dem UI-Thread erhöhen, die Sie fangen müssen. Die Gründe, warum dies schlecht ist, weil Sie Ihr Programm kann dazu führen, zu hängen oder abstürzen abhängig von subtilen Timing und Rennbedingungen für, wenn die Ausnahme ausgelöst wird.
Eine „sicherer“ Methode ist es, die Arbeiter Anruf Interrupt
haben - das wird eine ThreadInterruptedException
im UI-Thread zu erhöhen, aber nur, wenn es in dem WaitSleepJoin
Zustand ist - wenn der Thread es niemals schläft nicht unterbrechen, aber zumindest nicht oder beschädigt Speicher entweder hängen.
Andere Tipps
Nicht wirklich; insbesondere , wenn Sie keinen Zugriff auf die Quelle.
Auch wenn Sie könnten, ist es nicht eine gute Idee, mit Gewalt Code ohne Grund unterbrechen -. Es nur zu Problemen führen kann (Lecks, Schlösser links verriegelt sind, usw.)
muss es sein, die gleiche UI-Thread? Sie könnten einen zweiten UI-Thread laichen diesen Code zu besitzen? Es wird ein kleiner Scrappy, aber arbeiten kann.
Wenn Sie BeginInvoke verwenden, die IAsyncResult hat einen Warte Griff, auf dem Sie können WaitOne (Timeout) -. aus dem nicht-UI-Thread
Leider auf Timeout, gibt es keine saubere Art und Weise zu kündigen, dass BeginInvoke -. So können Sie 1800 INFORMATION
Lösung versuchen