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

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top