मैंने इंटरनेट पर लगभग हर जगह खोज की है, और मैंने कई बार गुगल किया है और इतने सारे परिणाम पाए हैं, लेकिन मुझे अभी भी मेरी समस्या का हल नहीं मिल रहा है।मैं Dispatcher.BeginInvoke का सही तरीके से उपयोग कैसे करूं?
मैं एक पुराने WP12 एप्लिकेशन में पुराने WinForms
एप्लिकेशन को परिवर्तित करने में व्यस्त हूं लेकिन मुझे कुछ आदेशों में समस्या है। विनफॉर्म एप्लिकेशन में वे Control.BeginInvoke()
का उपयोग करते हैं और इसे IAsyncResult ऑब्जेक्ट में संग्रहीत करते हैं। मैंने पढ़ा है कि Dispatcher.BeginInvoke()
WPF
WinForms
के लिए 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);
}
}
यदि कोई अन्य गलतियां हैं तो कृपया मुझे बताएं।
धन्यवाद
क्या आप वह कोड पोस्ट कर सकते हैं जिसे आप परिवर्तित करने का प्रयास कर रहे हैं? ऐसा लगता है कि आप मूल में 'Control.BeginInvoke' के वापसी मूल्य का उपयोग कर रहे हैं, लेकिन बिना किसी देखे, उचित परिवर्तन पर टिप्पणी करना मुश्किल है। –
माइकल का जवाब अच्छा है - लेकिन यह भी ध्यान देने योग्य है कि लाइन 'sr.AsyncWaitHandle.WaitOne (2000)' केवल मौजूदा थ्रेड को 2 सेकंड के लिए रोक देती है, और अनावश्यक प्रतीत होता है (कम से कम, मुझे उम्मीद है कि यह अनावश्यक है ...)। यदि आप उस रेखा को हटाते हैं, तो आपको वापसी मूल्य की आवश्यकता नहीं है (केवल कॉलबैक)। –
हां माइकल का जवाब अच्छा है लेकिन मुझे अभी भी एक छोटे से हिस्से में परेशानी हो रही है। मुझे कॉलबैक के लिए एक कस्टम एपीआई का उपयोग करने की आवश्यकता है। यही वह हिस्सा है जहां वे BeginInvoke() को IAsyncResult ऑब्जेक्ट को असाइन करते हैं। मैंने कोड को सही करने के कुछ तरीकों का प्रयास किया है ताकि वह इसका कार्य कर सके लेकिन मैं इसे सही करने के लिए संघर्ष कर रहा हूं। – GANDA1F