2013-12-17 4 views
6

Ich schreibe eine fortlaufende Abfrage-Schleife, um nach einigen Ereignissen zu suchen und dann etwas Aktion auf UI-Thread zu nehmen.Taskfortsetzung blockiert UI-Thread

Ich schreibe Code folgende

public static void HandlePopup(this HostedControl control, string className, string caption, System.Action callback) 
    { 
     var popupTask = Task.Factory.StartNew(() => 
     { 
      Thread.Sleep(5000); // just wait for 5 seconds. 
     }, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default).ContinueWith((prevTask) => 
     { 
      AutomationElementCollection collection = null; 
      do 
      { 

      } while (true); 
     }, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()).ContinueWith((prevTask) => 
     { 
      if (!prevTask.IsFaulted) 
      { 
       if (control.InvokeRequired) 
       { 
        control.Invoke(callback); 
       } 
       else 
       { 
        callback(); 
       } 
      } 
     }, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.FromCurrentSynchronizationContext()); 

     try 
     { 
      ////popupTask.Wait(); 
     } 
     catch (AggregateException ex) 
     { 
      ex.Handle(exnew => 
      { 
       return true; 
      }); 
     } 
    } 

Die Do While-Schleife keinen Code jetzt nicht, weil ich das getestet werden soll, wenn ich eine Schleife unendlich die Benutzeroberfläche läuft nicht blockieren, jedoch ist es nicht Arbeiten wie erwartet und wenn der Code diese Schleife ausführt (die nie zurückkehrt), friert die Benutzeroberfläche ein und reagiert nicht mehr, bis ich den Lauf abbruche.

Was soll ich es still im Hintergrund tun, um laufen,

Hinweis: die Eltern, von wo aus diese Methode aufgerufen wird, ist ein Web-Browser-Steuerung s documentcompelte` Ereignis. Das Webbrowser-Steuerelement befindet sich in Windows Forms-Anwendung.

+0

Ich habe Ihren Titel bearbeitet. Bitte lesen Sie "[Sollten die Fragen" Tags "in ihren Titeln enthalten?] (Http://meta.stackexchange.com/questions/19190/)", wobei der Konsens "nein, sie sollten nicht" lautet. –

+0

Danke, mein Schlechter :( – shashank

Antwort

14

Sie sind ausdrücklich die Fortsetzung zu sagen in dem aktuellen Synchronisationskontext laufen durch

TaskScheduler.FromCurrentSynchronizationContext() 

Also ja Angabe, das wird den UI-Thread blockiert, weil es in dem UI-Thread ausgeführt wird dieses gesamte Verfahren unter der Annahme, in einem UI-Thread aufgerufen. Die ursprüngliche Aufgabe wird im Hintergrund ausgeführt, aber Ihre Fortsetzungen werden beide im UI-Thread ausgeführt. Wenn Sie das nicht tun möchten, verwenden Sie diesen Taskplaner nicht.

+0

Weißt du? Ich habe mich erst seit einer Stunde mit diesem Code herumgeschlagen, nur um zu erkennen, dass ich einen so dummen Fehler gemacht habe :). Danke vielmals :) – shashank