7

मेरे पास एक निर्माता थ्रेड और एकाधिक उपभोक्ता धागे के साथ निम्न कोड है। क्या आप जानते हैं कि एकाधिक उपभोक्ता सुरक्षित हैं या नहीं। उदाहरण के लिए क्या कोई मौका है कि थ्रेड 1 उपभोग कर रहा है और जब वह धागा 2 समानांतर में उपभोग करता है और उस थ्रेड 1 में उपयोग किए गए आइटम के मान को बदलता है?अवरुद्ध चयन एकाधिक उपभोक्ता

namespace BlockingColl 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      for (int i = 0; i < 3; i++) 
      { 

       ThreadPool.QueueUserWorkItem((x) => 
        { 
         foreach (var item in bc.GetConsumingEnumerable()) 
         { 
          Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " - " + item + " - " + DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff tt")); 
         } 
        }); 
      } 
     } 
     catch (Exception) 
     { 

      throw; 
     } 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     for (int i = 0; i < 3; i++) 
     { 

      ThreadPool.QueueUserWorkItem((x) => 
       { 
        Cache.Consume(); 
       }); 
     } 


     for (int i = 0; i < 50000; i++) 
     { 
      Cache.bc.TryAdd(new Client() { ClientId = i, ClientName = "Name" + i }); 
     } 
    } 
} 

static class Cache 
{ 
    public static BlockingCollection<Client> bc = new BlockingCollection<Client>(); 


    public static void Consume() 
    { 
     foreach (var item in bc.GetConsumingEnumerable()) 
     { 
      Console.WriteLine(Thread.CurrentThread.ManagedThreadId + " - " + item + " - " + DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff tt")); 
     } 
    } 
} 

public class Client 
{ 
    public int ClientId { get; set; } 
    public string ClientName { get; set; } 
} 
} 

अग्रिम धन्यवाद केवल

उत्तर

1

एक बार जब आप तत्व का उपभोग कर लेते हैं तो इसे संग्रह से निकाल दिया जाता है, इसलिए कोई अन्य धागा इसे एक्सेस करने में सक्षम नहीं होगा (कम से कम संग्रह के माध्यम से)।

कि कैश मेरे लिए एक बफर की तरह दिखता है। वैसे भी अवरुद्ध संग्रह के शीर्ष पर यह क्या जोड़ता है? यह अजीब बात है कि कैश अपने तत्वों का उपभोग करने में सक्षम होगा।

+0

धन्यवाद। तुम सही हो। यह एक बफर है। नाम अप्रासंगिक हैं। जिस परिदृश्य से मैं पूछना चाहता था वह यह है कि क्या कोई मौका है कि जब थ्रेड 1 उपभोग कर रहा है और उस थ्रेड 2 को समानांतर में उपभोग करते हैं और उस आइटम के मान को बदलते हैं जो थ्रेड 1 में उपयोग किया जाता है क्योंकि आप देख सकते हैं कि मैं उपभोक्ता को तीन बार कॉल करता हूं समानांतर में (बटन 1_Click घटना) – pantonis

+0

फिर उत्तर नहीं है, कोई मौका नहीं है, लेकिन क्योंकि विभिन्न धागे एक ही तत्व का उपभोग नहीं कर सकते हैं। क्या आपको संग्रह में सभी तत्वों तक पहुंचने के लिए विभिन्न धागे की आवश्यकता है? यदि ऐसा है तो आप GetConsumingEnumerable() विधि का उपयोग नहीं कर सकते हैं। – fsimonazzi

+0

नहीं। मैं चाहता हूं कि कई उपभोक्ता हों जो बफर एएसएपी का उपभोग करेंगे। तो 'आइटम' ऑब्जेक्ट पर थ्रेड 1 पर फ़ोरैच लूप में किए गए किसी भी हेरफेर को थ्रेड 2 द्वारा संशोधित नहीं किया जाएगा? क्योंकि आप उपभोक्ता विधि को स्थिर मान सकते हैं। – pantonis

0

एक BlockingCollection ब्लॉक संग्रह ही। सूची में वस्तुओं नहीं है।

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