2011-05-24 18 views
7

क्या कोई सिंक्रोनस प्रतीक्षा फ़ंक्शन है जो .NET WPF में UI-thread को टाई नहीं करेगा? कुछ की तरह:यूआई-थ्रेड को अवरोधित किए बिना सिंक्रोनस प्रतीक्षा

Sub OnClick(sender As Object, e As MouseEventArgs) Handles button1.Click 
    Wait(2000) 
    'Ui still processes other events here 
    MessageBox.Show("Is has been 2 seconds since you clicked the button!") 
End Sub 
+0

आप इसे प्राप्त करने के लिए MsgWaitForMultipleObjects का उपयोग कर सकते हैं। –

उत्तर

15

आप बात की इस प्रकार की के लिए एक DispatcherTimer उपयोग कर सकते हैं।

संपादित करें: यह रूप में अच्छी तरह कर सकते हैं ...

private void Wait(double seconds) 
{ 
    var frame = new DispatcherFrame(); 
    new Thread((ThreadStart)(() => 
     { 
      Thread.Sleep(TimeSpan.FromSeconds(seconds)); 
      frame.Continue = false; 
     })).Start(); 
    Dispatcher.PushFrame(frame); 
} 

(Dispatcher.PushFrame documentation.)


.NET 4.5 के साथ शुरू आप async घटना संचालकों और Task.Delay उपयोग कर सकते हैं एक ही प्राप्त करने के लिए व्यवहार। ऐसे हैंडलर रिटर्न Dispatcher.Yield के दौरान यूआई अपडेट को बस जाने दें। सादा Win32 में

+1

डब्ल्यूपीएफ में आप डिफेंटर टिमर का अपमानजनक रूप से उपयोग करना चाहते हैं क्योंकि यह यूआई के थ्रेड पर निष्पादित करेगा जिससे आप यूआई नियंत्रण को संशोधित कर सकें। यदि आप मानक टाइमर का उपयोग करते हैं तो टिक अपने स्वयं के धागे पर निष्पादित होते हैं और यदि आप UI नियंत्रणों को स्पर्श करने का प्रयास करते हैं तो आपको कुछ बुरा अपवाद मिलेंगे। +1 – Jay

+0

क्या वेट इनलाइन करने के लिए टाइमर का उपयोग करने के लिए वैसे भी है। जब भी आपको प्रतीक्षा की आवश्यकता होती है तो जब आप किसी विधि को तोड़ते हैं तो पढ़ने के लिए बोझिल और कठिन लगता है। – PeterM

+1

@ पीटर मीटर: जैसा कि मैं थ्रेडिंग मुद्दों में बहुत अच्छी तरह से नहीं जानता हूं, आप [थ्रेडिंग मॉडल] (http://msdn.microsoft.com/en-us/library/ms741870.aspx) पर एक नज़र डालना चाहते हैं। संदर्भ और ['Dispatcher.PushFrame'] (http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.pushframe.aspx) विधि, जो आपको इसे सरल बनाने में मदद कर सकती है। –

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