2010-04-23 14 views
11

मुझे सी # पता है, लेकिन मुझे सिग्नलिंग जैसी कुछ बुनियादी (मुझे लगता है) अवधारणाओं को समझने में परेशानी हो रही है।थ्रेड सिग्नलिंग मूल बातें

मैं कुछ समय बिताया कुछ उदाहरण के लिए देख रहा है, यहाँ तक कि, भाग्य के बिना। शायद कुछ उदाहरण या वास्तविक सरल परिदृश्य इसे समझने के लिए बहुत अच्छा होगा।

उत्तर

20

यहाँ आप के लिए एक विशेष रूप से निर्मित सांत्वना आवेदन उदाहरण है। वास्तव में वास्तव में एक अच्छा वास्तविक परिदृश्य नहीं है, लेकिन थ्रेड सिग्नलिंग का उपयोग वहां है।

using System; 
using System.Threading; 

class Program 
{ 
    static void Main() 
    { 
     bool isCompleted = false; 
     int diceRollResult = 0; 

     // AutoResetEvent is one type of the WaitHandle that you can use for signaling purpose. 
     AutoResetEvent waitHandle = new AutoResetEvent(false); 

     Thread thread = new Thread(delegate() { 
      Random random = new Random(); 
      int numberOfTimesToLoop = random.Next(1, 10); 

      for (int i = 0; i < numberOfTimesToLoop - 1; i++) { 
       diceRollResult = random.Next(1, 6); 

       // Signal the waiting thread so that it knows the result is ready. 
       waitHandle.Set(); 

       // Sleep so that the waiting thread have enough time to get the result properly - no race condition. 
       Thread.Sleep(1000); 
      } 

      diceRollResult = random.Next(1, 6); 
      isCompleted = true; 

      // Signal the waiting thread so that it knows the result is ready. 
      waitHandle.Set(); 
     }); 

     thread.Start(); 

     while (!isCompleted) { 
      // Wait for signal from the dice rolling thread. 
      waitHandle.WaitOne(); 
      Console.WriteLine("Dice roll result: {0}", diceRollResult); 
     } 

     Console.Write("Dice roll completed. Press any key to quit..."); 
     Console.ReadKey(true); 
    } 
} 
+0

देर से प्रतिक्रिया के लिए धन्यवाद और खेद है एमरी (वीडियो कार्ड कल मर गया, आज नया खरीदा)। मैं इसे तुरंत चलाऊंगा। – Marcote

3

यह मुझे आप निश्चित संकेत देने के लिए के लिए एक बहुत बड़ी क्षेत्र है।

संकेत की तरह अवधारणाओं को समझने के लिए, Thread Synchronization पर इस लिंक एक अच्छी जगह शुरू करने के लिए किया जाएगा। यह भी उदाहरण मिल गया है। आप तो आप एक प्रक्रिया के भीतर या प्रक्रियाओं आदि भर में ऐसा करने के लिए .. धागे के बीच संकेत कोशिश कर रहे हैं क्या के आधार पर विशिष्ट .net प्रकार में विश्लेषण कर सकते हैं ..

4

जिस तरह से यह संक्षेप में काम करता है।

  1. AutoResetEvent waitHandle = new AutoResetEvent(false); --- झूठी इसका मतलब है कि प्रतीक्षा संभाल अगर एक waitHandle.WaitOne() कहा जाता है यह धागा बंद हो जाएगा unsignaled है।

  2. धागा आप पूरा करने के लिए एक और घटना के लिए इंतजार करना चाहते हैं waitHandle.WaitOne();

  3. जोड़ने धागा पूरा करने की जरूरत है कि में, अंत में जब पूरा जोड़ने waitHandle.Set();

waitHandle.WaitOne(); वेट्स संकेत

waitHandle.Set(); संकेतों पूरा करने के लिए।

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