मैं उपलब्ध 5 विकल्प देख सकता हूं:
1. थ्रेड। जॉइन
मिच के जवाब के साथ के रूप में। लेकिन इससे आपका UI थ्रेड ब्लॉक हो जाएगा, हालाँकि आपको अपने लिए एक टाइमआउट मिल जाता है।
2. का उपयोग करें WaitHandle
ManualResetEvent
जैसा WaitHandle
कि जिस्त्र ने सुझाया है।
ध्यान देने वाली एक बात यह है कि यदि आप कई थ्रेड के लिए प्रतीक्षा करना चाहते हैं, WaitHandle.WaitAll()
तो डिफ़ॉल्ट रूप से काम नहीं करेगा, क्योंकि इसके लिए एमटीए थ्रेड की आवश्यकता है। आप इसके Main()
साथ अपने तरीके को चिह्नित करके प्राप्त कर सकते हैं MTAThread
- हालांकि यह आपके संदेश पंप को अवरुद्ध करता है और मैंने जो पढ़ा है, उससे अनुशंसित नहीं है।
3. एक घटना आग
घटनाओं और बहु-थ्रेडिंग के बारे में जॉन स्कीट के इस पृष्ठ को देखें , यह संभव है कि कोई घटना मेरे if
और उसके बीच अनसुनी हो सकती है EventName(this,EventArgs.Empty)
- यह मेरे साथ पहले भी हो चुका है।
(उम्मीद है कि ये संकलन, मैंने कोशिश नहीं की है)
public class Form1 : Form
{
int _count;
void ButtonClick(object sender, EventArgs e)
{
ThreadWorker worker = new ThreadWorker();
worker.ThreadDone += HandleThreadDone;
Thread thread1 = new Thread(worker.Run);
thread1.Start();
_count = 1;
}
void HandleThreadDone(object sender, EventArgs e)
{
// You should get the idea this is just an example
if (_count == 1)
{
ThreadWorker worker = new ThreadWorker();
worker.ThreadDone += HandleThreadDone;
Thread thread2 = new Thread(worker.Run);
thread2.Start();
_count++;
}
}
class ThreadWorker
{
public event EventHandler ThreadDone;
public void Run()
{
// Do a task
if (ThreadDone != null)
ThreadDone(this, EventArgs.Empty);
}
}
}
4. एक प्रतिनिधि का उपयोग करें
public class Form1 : Form
{
int _count;
void ButtonClick(object sender, EventArgs e)
{
ThreadWorker worker = new ThreadWorker();
Thread thread1 = new Thread(worker.Run);
thread1.Start(HandleThreadDone);
_count = 1;
}
void HandleThreadDone()
{
// As before - just a simple example
if (_count == 1)
{
ThreadWorker worker = new ThreadWorker();
Thread thread2 = new Thread(worker.Run);
thread2.Start(HandleThreadDone);
_count++;
}
}
class ThreadWorker
{
// Switch to your favourite Action<T> or Func<T>
public void Run(object state)
{
// Do a task
Action completeAction = (Action)state;
completeAction.Invoke();
}
}
}
यदि आप _count विधि का उपयोग करते हैं, तो यह एक विचार हो सकता है (सुरक्षित होने के लिए) इसका उपयोग करने के लिए वेतन वृद्धि
Interlocked.Increment(ref _count)
मैं थ्रेड नोटिफिकेशन के लिए प्रतिनिधियों और घटनाओं का उपयोग करने के बीच के अंतर को जानना चाहूंगा, एकमात्र अंतर जो मुझे पता है कि घटनाओं को सिंक्रोनाइज़ कहा जाता है।
5. इसके बजाय इसे एसिंक्रोनस रूप से करें
इस प्रश्न के उत्तर में इस पद्धति के साथ आपके विकल्पों का बहुत स्पष्ट विवरण है।
गलत धागे पर प्रतिनिधि / घटनाएँ
चीजों को करने का घटना / प्रतिनिधि तरीका मतलब होगा कि आपकी घटना हैंडलर विधि थ्रेड 1 / थ्रेड 2 पर है , मुख्य यूआई थ्रेड नहीं है , इसलिए आपको हैंडहेलड्रेड विधियों के शीर्ष पर सही स्विच करने की आवश्यकता होगी:
// Delegate example
if (InvokeRequired)
{
Invoke(new Action(HandleThreadDone));
return;
}