2013-04-10 12 views
5

मैंने इंटरनेट पर लगभग हर जगह खोज की है, और मैंने कई बार गुगल किया है और इतने सारे परिणाम पाए हैं, लेकिन मुझे अभी भी मेरी समस्या का हल नहीं मिल रहा है।मैं Dispatcher.BeginInvoke का सही तरीके से उपयोग कैसे करूं?

मैं एक पुराने WP12 एप्लिकेशन में पुराने WinForms एप्लिकेशन को परिवर्तित करने में व्यस्त हूं लेकिन मुझे कुछ आदेशों में समस्या है। विनफॉर्म एप्लिकेशन में वे Control.BeginInvoke() का उपयोग करते हैं और इसे IAsyncResult ऑब्जेक्ट में संग्रहीत करते हैं। मैंने पढ़ा है कि Dispatcher.BeginInvoke()WPFWinForms के लिए Control.BeginInvoke() के बराबर है लेकिन जब मैं

Dispatcher.BeginInvoke() का उपयोग मैं इस त्रुटि मिलती है: "परोक्ष कनवर्ट नहीं कर सकता प्रकार 'System.Windows.Threading.DispatcherOperation' 'System.IAsyncResult' के लिए। एक स्पष्ट रूपांतरण मौजूद है (क्या आप एक कलाकार गायब हैं?) "।

किसी भी मदद की सराहना की जाएगी।

यहां वह कोड है जिसे मैं परिवर्तित करने की कोशिश कर रहा हूं। यह मूल WinForms कोड है। मैं BeginInvoke भाग को छोड़कर सबकुछ बदलने में सक्षम हूं।

private eSkan.api.TeSkanAPI feSkanAPI = null; 

    private void MessageFilter_AddRemove_Invoked(bool AddFilter, IMessageFilter Filter) 
    { 
     if (AddFilter){ Application.AddMessageFilter(Filter); } 
     else { Application.RemoveMessageFilter(Filter); } 
    } 

    private void MessageFilter_AddRemove(bool AddFilter, IMessageFilter Filter) 
    { 
     { 
      IAsyncResult sr = BeginInvoke((ESKAN_ADD_REMOVE_MESSAGEFILTER)MessageFilter_AddRemove_Invoked, 
              AddFilter, Filter); 
      sr.AsyncWaitHandle.WaitOne(2000); 
     } 
    } 

नीचे मेरी कोड है कि मैं BeginInvoke बात यह है कि मैं के साथ संघर्ष कर रहा हूँ सहित अब तक परिवर्तित कर दिया है।

private void MessageFilter_AddRemove_Invoked(bool addFilter, System.Windows.Forms.IMessageFilter filter) 
    { 
     if (addFilter) 
     { 
      System.Windows.Forms.Application.AddMessageFilter(filter); 
     } 
     else 
     { 
      System.Windows.Forms.Application.RemoveMessageFilter(filter); 
     } 
    } 

    private void MessageFilter_AddRemove(bool addFilter, System.Windows.Forms.IMessageFilter filter) 
    { 
     { 
      IAsyncResult sr = System.Windows.Threading.Dispatcher.BeginInvoke((ESKAN_ADD_REMOVE_MESSAGEFILTER)MessageFilter_AddRemove_Invoked, addFilter, filter); 
      sr.AsyncWaitHandle.WaitOne(2000); 
     } 
    } 

यदि कोई अन्य गलतियां हैं तो कृपया मुझे बताएं।

धन्यवाद

+2

क्या आप वह कोड पोस्ट कर सकते हैं जिसे आप परिवर्तित करने का प्रयास कर रहे हैं? ऐसा लगता है कि आप मूल में 'Control.BeginInvoke' के वापसी मूल्य का उपयोग कर रहे हैं, लेकिन बिना किसी देखे, उचित परिवर्तन पर टिप्पणी करना मुश्किल है। –

+0

माइकल का जवाब अच्छा है - लेकिन यह भी ध्यान देने योग्य है कि लाइन 'sr.AsyncWaitHandle.WaitOne (2000)' केवल मौजूदा थ्रेड को 2 सेकंड के लिए रोक देती है, और अनावश्यक प्रतीत होता है (कम से कम, मुझे उम्मीद है कि यह अनावश्यक है ...)। यदि आप उस रेखा को हटाते हैं, तो आपको वापसी मूल्य की आवश्यकता नहीं है (केवल कॉलबैक)। –

+0

हां माइकल का जवाब अच्छा है लेकिन मुझे अभी भी एक छोटे से हिस्से में परेशानी हो रही है। मुझे कॉलबैक के लिए एक कस्टम एपीआई का उपयोग करने की आवश्यकता है। यही वह हिस्सा है जहां वे BeginInvoke() को IAsyncResult ऑब्जेक्ट को असाइन करते हैं। मैंने कोड को सही करने के कुछ तरीकों का प्रयास किया है ताकि वह इसका कार्य कर सके लेकिन मैं इसे सही करने के लिए संघर्ष कर रहा हूं। – GANDA1F

उत्तर

4

ऐसा इसलिए है क्योंकि Dispatcher.BeginInvoke है, हालांकि यह बराबर तार्किक आपरेशन हो सकता है, वापस नहीं करता है एक IAsyncResult, यह रिटर्न एक DispatcherOperationthis blog post पर एक नज़र डालें और आपको काम करने के तरीके पर एक अच्छा उदाहरण दिखाई देगा। मैंने यह सुनिश्चित करने के लिए प्रासंगिक कोड उदाहरण यहां कॉपी किया है कि यह बाद में मौजूद है। इस लाइन के लिए

public Window1() 
{ 
    InitializeComponent(); 

    CheckBox myCheckBox = new CheckBox(); 
    myCheckBox.Content = "A Checkbox"; 

    System.Threading.Thread thread = new System.Threading.Thread(
    new System.Threading.ThreadStart(
     delegate() 
     { 
     System.Windows.Threading.DispatcherOperation 
      dispatcherOp = myCheckBox.Dispatcher.BeginInvoke(
      System.Windows.Threading.DispatcherPriority.Normal, 
      new Action(
      delegate() 
      { 
       myCheckBox.IsChecked = true; 
      } 
     )); 

     dispatcherOp.Completed += new EventHandler(dispatcherOp_Completed); 
     } 
)); 

    thread.Start(); 
} 

void dispatcherOp_Completed(object sender, EventArgs e) 
{ 
    Console.WriteLine("The checkbox has finished being updated!"); 
} 

लें ध्यान दें:

dispatcherOp.Completed += new EventHandler(dispatcherOp_Completed); 

है कि कैसे आप को पता है जब यह काम पूरा होने के लिए जा रहे हैं - यह है कि घटना के माध्यम से आप के लिए वापस बुलाने जा रहा है।

+0

आपके उत्तर माइकल के लिए बहुत बहुत धन्यवाद। आपका काम बहुत अच्छा धन्यवाद। – GANDA1F

+0

मुझे बस एक और चीज़ के साथ मदद चाहिए। यही है कि मुझे एक फ़ंक्शन में दो अलग-अलग चर पारित करने की आवश्यकता है जिसे मैं कॉल कर रहा हूं। अगर अस्पष्ट है तो कृपया उपरोक्त मेरा कोड देखें। – GANDA1F

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

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