2013-12-17 22 views
6

いくつかのイベントが発生するのを監視し、UIスレッドで何らかのアクションを取るために、連続ポーリングループを作成しています。タスク継続ブロックUIスレッド

ループは、私は無限ループを実行する場合、UIはブロックしないことをテストしたいので、しかし、それはないが、今の任意のコードを持っていませんが、私は次のコード

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; 
      }); 
     } 
    } 

にDOを書いています期待どおりに動作し、コードがこのループを実行すると(戻りません)、UIがフリーズし、実行を中断するまで応答しなくなります。

私は何をして、それがバックグラウンドで実行させるために行う、

注意する必要があります。このメソッドが呼び出された場所からの親は、Webブラウザコントロールs documentcompelte`イベントです。 Webブラウザコントロールは、Windowsフォームアプリケーション内にあります。

+0

タイトルを編集しました。 「[質問には「タイトル内に「タグ」を含める必要がありますか」(http://meta.stackexchange.com/questions/19190/)」を参照してください。コンセンサスは「いいえ、そうすべきではありません」です。 –

+0

ありがとう、私の悪い:( – shashank

答えて

14

あなたはそれがこの全体的な方法があると仮定すると、UIスレッドで実行しているので、そうです、それはUIスレッドをブロックします

TaskScheduler.FromCurrentSynchronizationContext() 

を指定することにより、現在の同期コンテキストで実行するために継続を伝える明示的ですUIスレッドで呼び出されます。元のタスクはバックグラウンドで実行されますが、継続はどちらもUIスレッドで実行するようスケジュールされています。それをしたくない場合は、そのタスクスケジューラを使用しないでください。

+0

あなたは知っていますか?私はこのコードで一時間しか苦しんでいませんでした。ありがとう、トン:) – shashank

関連する問題