2013-12-17 191 views
6

我正在編寫一個連續的輪詢循環來監視某些事件發生,然後在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 while循環沒有任何代碼了,因爲我想測試,如果我運行一個無限循環的用戶界面不會阻止,但它不是按預期工作,當代碼運行此循環時(將永不返回),UI凍結並變得無法響應,直到我終止運行。

我應該做的,使其在後臺靜默運行,

注:從那裏調用此方法是一個Web瀏覽器控件s documentcompelte`事件父。 Web瀏覽器控件位於Windows窗體應用程序內部。

+0

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

謝謝,我的壞:( – shashank

回答

14

明確告訴延續指定

TaskScheduler.FromCurrentSynchronizationContext() 

所以,是的,這將阻止用戶界面線程,因爲它是在UI線程中運行假設這一總體方法是在當前同步上下文運行在UI線程中調用。原始任務將在後臺運行,但您的延續都計劃在UI線程中運行。如果您不想這樣做,請不要使用該任務計劃程序。

+0

你知道嗎?我一直在努力與這個代碼一個小時才意識到我正在做這樣一個愚蠢的錯誤:)。萬分感謝 :) – shashank