2013-12-17 22 views
6

Bazı olayların gerçekleşmesini izlemek için UI iş parçacığı üzerinde biraz harekete geçmek için sürekli bir yoklama döngüsü yazıyorum.Görev sürekliliği engelleniyor UI iş parçacığı

ben ben bir döngü çalıştırırsanız sonsuz UI engellememesi anlamına test etmek istiyorum çünkü döngü, şimdi herhangi bir kod yok iken kodu

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 aşağıdaki yazıyorum, ancak, öyle değil mi beklendiği gibi çalışıyor ve kod bu döngüyü çalıştırdığında (ki asla geri dönmeyecek) UI donuyor ve koşuyu kırıncaya kadar yanıt vermiyor.

i arka planda sessizce çalışır hale getirmek ne yapmalıyım

,

Not: adlandırılan bu yöntem, bir Web tarayıcısı denetimi s documentcompelte` olaydır yerden ebeveyn. Web tarayıcısı kontrolü, windows form uygulamasında yer almaktadır.

+0

Başlığınızı düzenledim. Lütfen, "[Sorular soruların başlığında" etiketler içeriyor mu? "(Http://meta.stackexchange.com/questions/19190/)" bölümüne bakacak olursak, fikir birliği "hayır, yapmamalı" dır. –

+0

Teşekkürler, benim kötü :( – shashank

cevap

14

Bunu bu genel yöntem olduğunu varsayarak UI iş parçacığı içinde çalıştırdığından Yani evet, bu UI iş parçacığı engeller

TaskScheduler.FromCurrentSynchronizationContext() 

belirterek mevcut senkronizasyon bağlamında çalışmasına devam söylüyorum açıkça konum bir UI iş parçacığı denir. Özgün görev arka planda çalışır, ancak devamlarınızın her ikisinin de UI iş parçacığında çalışması planlanır. Bunu yapmak istemiyorsanız, o görev zamanlayıcıyı kullanmayın.

+0

Biliyor musunuz? Bu kod ile uğraşıyorum sadece bir saatliğine uğraşıyorum sadece bu kadar aptalca bir hata yaptığımı fark ettim :). Teşekkürler bir ton :) – shashank

İlgili konular