आइए कहें कि मेरे पास टास्किंग नामक एक घटक है (जिसे मैं संशोधित नहीं कर सकता) जो एक विधि "DoTask" का खुलासा करता है जो कुछ संभवतः लंबी गणना करता है और परिणाम को कार्य पूर्ण के माध्यम से परिणाम देता है। आम तौर पर इसे विंडोज़ फॉर्म में कहा जाता है जिसे उपयोगकर्ता परिणाम प्राप्त करने के बाद बंद कर देता है।क्या कॉलर को एक अलग थ्रेड पर इवेंट हैंडलर रखना संभव है?
मेरे विशेष परिदृश्य में मुझे कार्य में लौटाए गए डेटा के साथ कुछ डेटा (डेटाबेस रिकॉर्ड) को जोड़ने की आवश्यकता है और डेटाबेस रिकॉर्ड को अपडेट करने के लिए इसका उपयोग करें।
मैंने ईवेंट को संभालने के दौरान सूचित करने के लिए ऑटोरसेट इवेंट के उपयोग की जांच की है। इसके साथ समस्या AutoResetEvent.WaitOne() ब्लॉक होगी और ईवेंट हैंडलर कभी नहीं बुलाया जाएगा। आम तौर पर AutoResetEvents को एक अलग थ्रेड कहा जाता है, इसलिए मुझे लगता है कि इसका मतलब है कि ईवेंट हैंडलर उसी विधि पर है जो कॉल करने वाली विधि के रूप में होता है।
अनिवार्य रूप से मैं एक एसिंक्रोनस कॉल को चालू करना चाहता हूं, जहां परिणाम किसी ईवेंट के माध्यम से एक सिंक्रोनस कॉल (यानी किसी अन्य वर्ग से DoSyncTask को कॉल करें) में तब तक अवरुद्ध कर दिया जाता है जब तक ईवेंट को संभाला नहीं जाता है और परिणाम किसी स्थान पर पहुंच योग्य होते हैं इवेंट हैंडलर और जिस विधि को एसिंक कॉल शुरू करने वाली विधि कहा जाता है।
public class SyncTask
{
TaskCompletedEventArgs data;
AutoResetEvent taskDone;
public SyncTask()
{
taskDone = new AutoResetEvent(false);
}
public string DoSyncTask(int latitude, int longitude)
{
Task t = new Task();
t.Completed = new TaskCompletedEventHandler(TaskCompleted);
t.DoTask(latitude, longitude);
taskDone.WaitOne(); // but something more like Application.DoEvents(); in WinForms.
taskDone.Reset();
return data.Street;
}
private void TaskCompleted(object sender, TaskCompletedEventArgs e)
{
data = e;
taskDone.Set(); //or some other mechanism to signal to DoSyncTask that the work is complete.
}
}
In a Windows App the following works correctly.
public class SyncTask
{
TaskCompletedEventArgs data;
public SyncTask()
{
taskDone = new AutoResetEvent(false);
}
public string DoSyncTask(int latitude, int longitude)
{
Task t = new Task();
t.Completed = new TaskCompletedEventHandler(TaskCompleted);
t.DoTask(latitude, longitude);
while (data == null) Application.DoEvents();
return data.Street;
}
private void TaskCompleted(object sender, TaskCompletedEventArgs e)
{
data = e;
}
}
मैं सिर्फ एक खिड़की सेवा, जहां Application.Run नहीं बुलाया जाता है और ApplicationContext वस्तु उपलब्ध नहीं है में है कि व्यवहार को दोहराने की जरूरत है।
'ऑटोरसेट इवेंट' को समझने के लिए यहां एक अच्छा वीडियो है http://www.youtube.com/watch?v=xaaRBh07N34 – Jaider