2013-12-17 13 views
6

मैं कुछ घटनाओं के लिए देखने के लिए निरंतर मतदान लूप लिख रहा हूं और फिर यूआई थ्रेड पर कुछ कार्रवाई करता हूं।टास्क निरंतरता अवरुद्ध यूआई थ्रेड

मैं कोड

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

करते अनुसरण करते हुए पाश अब किसी भी कोड नहीं है, क्योंकि मैं परीक्षण करने के लिए कि अगर मैं एक पाश चलाने असीम यूआई ब्लॉक नहीं करता चाहते हैं लिख रहा हूँ, हालांकि, यह नहीं है उम्मीद के अनुसार काम करते हैं और जब कोड इस लूप को चलाता है (जो कभी वापस नहीं आएगा) यूआई फ्रीज हो जाता है और जब तक मैं दौड़ तोड़ता हूं तब तक उत्तरदायी नहीं होता है।

क्या मैं इसे पृष्ठभूमि में चुपचाप चलाने बनाने के लिए क्या करना चाहिए,

नोट: जहां इस विधि कहा जाता है एक वेब ब्राउज़र नियंत्रण s documentcompelte` घटना है से माता-पिता। वेब ब्राउज़र नियंत्रण खिड़कियों के रूप में आवेदन के अंदर है।

+0

मैंने आपका शीर्षक संपादित किया है। कृपया देखें, "[प्रश्नों में उनके शीर्षक में" टैग "शामिल होना चाहिए?] (Http://meta.stackexchange.com/questions/19190/)", जहां आम सहमति है "नहीं, उन्हें नहीं करना चाहिए"। –

+0

धन्यवाद, मेरा बुरा :( – shashank

उत्तर

14

आप स्पष्ट रहे क्योंकि यह मानते हुए कि इस समग्र विधि है यूआई सूत्र में चल रहा है

TaskScheduler.FromCurrentSynchronizationContext() 

को निर्दिष्ट तो हाँ, कि यूआई धागा को अवरुद्ध कर देगा द्वारा वर्तमान समन्वयन संदर्भ में चलाने के लिए जारी रखने के कह रही यूआई थ्रेड में बुलाया जाता है। मूल कार्य पृष्ठभूमि में चलाया जाएगा, लेकिन आपकी निरंतरता यूआई थ्रेड में चलाने के लिए निर्धारित है। यदि आप ऐसा नहीं करना चाहते हैं, तो उस कार्य शेड्यूलर का उपयोग न करें।

+0

आप जानते हैं? मैं इस कोड के साथ एक घंटे के लिए संघर्ष कर रहा हूं केवल यह महसूस करने के लिए कि मैं इतनी बेवकूफ गलती कर रहा था :)। अनेक अनेक धन्यवाद :) – shashank

संबंधित मुद्दे