2010-04-19 13 views
6

मैं पढ़ा है सी # संस्करण इस प्रकार है कि:मैं WPF में "DoEvents" कैसे करूं?

Application.Current.Dispatcher.Invoke(
      DispatcherPriority.Background, 
      new Action(delegate { })); 

हालांकि मैं समझ नहीं कैसे VB.NET में खाली प्रतिनिधि डाल करने के लिए, के रूप में VB.NET गुमनाम तरीकों का समर्थन करने के लिए प्रकट नहीं होता। विचार?

संपादित करें: संभवतः यह?

Application.Current.Dispatcher.Invoke(
    DispatcherPriority.Background, 
    New Action(Sub() 

      End Sub)) 
+0

DoEvents? मेरा मानना ​​है कि वे VB6 में वापस DoEvents का उपयोग करते थे, इससे पहले कि लोगों को एहसास हुआ कि एप्लिकेशन केवल यूआई थ्रेड से अधिक हो सकता है। – Will

+0

वैसे आधुनिक सम्मेलन थ्रेड स्लीप (1) या इसी तरह का उपयोग करना है, लेकिन यह काम नहीं करता है जब आपको अस्थायी रूप से थ्रेड से बाहर निकलने की आवश्यकता होती है ताकि यूआई को खुद को अपडेट कर सकें और प्रोसेसिंग लूप के बीच में रह सकें WPF। – NibblyPig

+1

@ एसएलसी: यदि आप अपने प्रसंस्करण को किसी अन्य थ्रेड में कर रहे हैं, तो आपको यूआई को खुद को अपडेट करने की आवश्यकता नहीं है (केवल एक सामान्य ताज़ा तरीके से)। –

उत्तर

6

VB.NET गुमनाम प्रतिनिधियों का समर्थन करता है, लेकिन केवल एकल बयान कार्यों के रूप में।

संदर्भ प्रदान करने के लिए (मल्टी बयान अनाम प्रक्रियाएं और अनाम Sub रों .NET 4 में VB10 में जोड़ा गया है), DoEvents यूआई और प्रक्रिया अन्य Windows संदेशों अद्यतन करने के लिए एक एकल पिरोया पर्यावरण अनुमति देने के लिए डिजाइन किया गया था, जबकि काम था किया जा रहा है। DoEvents (या, जैसा कि आप यहां कर रहे हैं, प्रेषक पर "शून्य" फ़ंक्शन निष्पादित करके अप्रत्यक्ष रूप से ऐसा करने के लिए कोई लाभ नहीं होना चाहिए, क्योंकि यूआई थ्रेड स्वयं ही अपडेट हो रहा है।

अपने सवाल का जवाब देने के हित में है, हालांकि, सबसे आसान विकल्प कुछ इस तरह होगा:

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, _ 
    New Action(Function() 7)) 

लेकिन, फिर से, मैं नहीं देख सकता कि यह वास्तव में हासिल करेगी।

यदि आप जो खोज रहे हैं वह यूआई थ्रेड पर कोड निष्पादित करना है (जैसे Control.Invoke विंडोज रूपों से), तो Dispatcher.Invoke (जो आप उपयोग कर रहे हैं) सही है, आपको बस बुद्धिमान कार्यों में अपनी इनलाइन अज्ञात विधियों का अनुवाद करें और उन प्रतिनिधियों के रूप में पास करें। कुछ हो सकते हैं कि आप अज्ञात के रूप में जाने से दूर हो सकते हैं। उदाहरण के लिए, अगर सभी आप कर रहे हैं एक प्रगति बार अपडेट कर रहा है, तो आप कर सकता है:

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, _ 
    New Action(Function() progressBar.Value = 100)) 

यह काम करता है क्योंकि सभी कार्य है कि काम के बाईं ओर में जमा हो गया था मान। आप नहीं है, तथापि, सिर्फ एक उप इस तरह कह सकते हैं (निम्नलिखित संकलन नहीं होगा जब तक SomeFunctionName रिटर्न एक मूल्य):

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, _ 
    New Action(Function() SomeFunctionName(params))) 

दूसरे शब्दों में, गुमनाम प्रतिनिधियों कि सी # कोड में है कि या तो कर रहे हैं के किसी भी (अर्थात यह एक समारोह नहीं एक पद्धति के लिए बस एक ही कॉल है)

तो फिर तुम हूँ

  • एक से अधिक बयान
  • कोई मान नहीं है ज: उन लोगों के लिए फ़ंक्शंस बनाने और उन कार्यों को प्रतिनिधियों को पास करने के बजाय, जो आपके पास सी # में कोड को रेखांकित करने के बजाय हैं।

+0

यूआई केवल तभी अपडेट हो सकता है जब उसे किसी मौके पर मौका मिलता है, जो किसी फ़ंक्शन के अंत में होता है। यही कारण है कि यदि आप इसमें लूप डालते हैं तो आपका ऐप अप्रतिबंधित हो जाता है, और यहां तक ​​कि थ्रेड नींद के साथ भी अन्य थ्रेड पर स्विच को मजबूर करने के लिए विंडोज़ फॉर्म में आमंत्रण किए बिना यूआई घटकों को लूप में अपडेट नहीं किया जाएगा। मुझे लगता है कि यह वही है। – NibblyPig

+0

आप फंक्शन() को उप() में बदल सकते हैं और मेरे पास एक खाली उप() है जैसा कि मैंने अपने संपादन में अनुमान लगाया है, क्योंकि मैंने अभी कोड में इसकी पुष्टि की है और ऐसा लगता है। – NibblyPig

+3

@ एसएलसी: यह केवल तभी सच है यदि आप जो कर रहे हैं वह * यूआई थ्रेड * पर हो रहा है। यदि कोड किसी अन्य धागे पर निष्पादित हो रहा है, तो यह आवश्यक नहीं है। ** यदि आप क्या कर रहे हैं * UI थ्रेड पर निष्पादित है और एक स्पष्ट यूआई अपडेट की आवश्यकता के लिए काफी समय लग रहा है, तो इसे किसी अन्य थ्रेड में ले जाया जाना चाहिए। ** –

0

समारोह कीवर्ड का प्रयोग करें:

Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, New Action(Function() Do ... End Function)) 
+0

समस्या यह है कि कार्रवाई कुछ भी नहीं करती है, तो मैं वहां क्या रख सकता हूं जो "कुछ भी नहीं है "? एक समारोह एक चर लौटाता है। – NibblyPig

+0

क्या यह संकलित करता है यदि आप केवल डॉट्स को हटाते हैं? हम वीबी/.NET का किस संस्करण के बारे में बात कर रहे हैं? –

1

आपके पास दो प्रश्न हैं, इसलिए मैं दो उत्तरों को जोड़ने जा रहा हूं। यहां, मैं जवाब दे रहा हूं "WPF में DoEvents कैसे करें"।बिया Stollnitz her blog पर इस को शामिल किया गया, और यहाँ VB में कोड है:

publicShared Sub WaitForPriority(priority As DispatcherPriority) 
    Dim frame As New DispatcherFrame() 
    Dim dispatcherOperation As DispatcherOperation = Dispatcher.CurrentDispatcher.BeginInvoke(priority, New DispatcherOperationCallback(ExitFrameOperation), frame) 
    Dispatcher.PushFrame(frame) 
    If dispatcherOperation.Status <> DispatcherOperationStatus.Completed Then 
     dispatcherOperation.Abort() 
    End If 
End Sub 

Private Shared Function ExitFrameOperation(obj As Object) As Object 
    (DirectCast(obj, DispatcherFrame)).[Continue] = False 
    Return Nothing 
End Function 
3

आप बस इस विधि कह सकते हैं कि आप कुछ यूआई पर ताज़ा करना चाहते हैं:

System.Windows.Forms.Application.DoEvents 

हम इस पर प्रयोग कर रहे हैं हमारी डब्ल्यूपीएफ विंडो और एक्सबीएपी अनुप्रयोग।

0

या सीधे शब्दों में अपने आप को WPF के लिए एक DoEvents() बनाने के लिए डिस्पैचर का उपयोग करें:

'The WPF equivalent of DoEvents!! 
Public Sub DoEvents() 
    Dispatcher.Invoke(New Action(Function() 
            Return Nothing 
           End Function), DispatcherPriority.ContextIdle, Nothing) 
End Sub 
संबंधित मुद्दे