सबसे पहले, मैं एक संक्षिप्त परिदृश्य समझाऊंगा;थ्रेड सुरक्षित कतार - एनक्यू/डेक्यू
कुछ डिवाइस ट्रिगर्स से सिग्नल के रूप में, अलार्म प्रकार की एक वस्तु को कतार में जोड़ा जाता है। एक अंतराल पर, कतार की जांच की जाती है, और कतार में प्रत्येक अलार्म के लिए, यह एक विधि को आग लगती है।
हालांकि, जिस समस्या में मैं दौड़ रहा हूं वह यह है कि, अगर किसी अलार्म को कतार में जोड़ा जाता है, जबकि इसे घुमाया जा रहा है, तो यह कहने में त्रुटि उत्पन्न होती है कि जब आप इसका उपयोग कर रहे थे तो कतार बदल गई है। मेरी कतार दिखाने के लिए यहां कुछ कोड दिया गया है, बस मान लें कि अलार्म लगातार इसमें डाला जा रहा है;
public class AlarmQueueManager
{
public ConcurrentQueue<Alarm> alarmQueue = new ConcurrentQueue<Alarm>();
System.Timers.Timer timer;
public AlarmQueueManager()
{
timer = new System.Timers.Timer(1000);
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.Enabled = true;
}
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
DeQueueAlarm();
}
private void DeQueueAlarm()
{
try
{
foreach (Alarm alarm in alarmQueue)
{
SendAlarm(alarm);
alarmQueue.TryDequeue();
//having some trouble here with TryDequeue..
}
}
catch
{
}
}
तो मेरा सवाल यह है कि, मैं इसे और कैसे बना सकता हूं ... थ्रेड सुरक्षित? ताकि मैं इन मुद्दों में भाग नहीं पाऊंगा। शायद कतार को दूसरी कतार में कॉपी करना, उस पर काम करना, फिर मूल कतार से निपटने वाले अलार्म को हटा देना?
संपादित करें: बस समवर्ती कतार के बारे में सूचित कर दिया गया है, इस बाहर की जाँच करेगा अब
आपको पहले कतार से आइटम और SendAlarm सेकंड को पॉप करना चाहिए, साथ ही साथ एक सामान्य थ्रेड-सुरक्षित कतार कार्यान्वयन का उपयोग करना चाहिए। यदि आप किसी आइटम को संभाल नहीं सकते हैं तो इसे फिर से दबाएं। – cdleonard