2013-12-17 89 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