के साथ सक्षम करने के लिए मेरे पिछले question है जो मैंने अपना समाधान प्रदान किया है; हालांकि, मेरे पास ConcurrentQueue<T>
तक पहुंच नहीं है क्योंकि मैं नेट 3.5 पर हूं। समेकन की अनुमति देने के लिए मुझे Queue<T>
की आवश्यकता है। मैंने यह question पढ़ा है और कतार में नहीं है और थ्रेडेड विधि किसी आइटम को निकालने का प्रयास करती है तो कोई समस्या उत्पन्न होती है।कंसूरेंसी <T> कंसुरेंसी
मेरा कार्य अब यह निर्धारित करना है कि मैं अपनी समवर्ती कतार कक्षा प्राप्त कर सकता हूं या नहीं।
public sealed class ConcurrentQueue : Queue<DataTable>
{
public event EventHandler<TableQueuedEventArgs> TableQueued;
private ICollection que;
new public void Enqueue(DataTable Table)
{
lock (que.SyncRoot)
{
base.Enqueue(Table);
}
OnTableQueued(new TableQueuedEventArgs(Dequeue()));
}
// this is where I think I will have a problem...
new public DataTable Dequeue()
{
DataTable table;
lock (que.SyncRoot)
{
table = base.Dequeue();
}
return table;
}
public void OnTableQueued(TableQueuedEventArgs table)
{
EventHandler<TableQueuedEventArgs> handler = TableQueued;
if (handler != null)
{
handler(this, table);
}
}
}
तो, जब एक DataTable कतारबद्ध है, EventArgs एक dequeued तालिका घटना ग्राहक के लिए पारित करेंगे: यह है कि मैं क्या के साथ आया है। क्या यह कार्यान्वयन मुझे थ्रेड-सुरक्षित कतार प्रदान करेगा?
'que' _utterly_ बेकार है। आपको 'रीडोनली ऑब्जेक्ट कुंजी = नई ऑब्जेक्ट();' पर लॉक करना चाहिए। – SLaks
@ स्लक्स: मैंने एमएसडीएन पर आधारित 'आईसीओलेक्शन क्यू' और 'लॉक (que.SyncRoot)' लागू किया: http://msdn.microsoft.com/en-us/library/bb344892.aspx – IAbstract
आपको इसकी आवश्यकता नहीं है सब। 'सिंक रूट' उपयोगी है यदि आपके पास कोड के टुकड़े अलग हैं जिन्हें एक ही संग्रह के लिए लॉक करने की आवश्यकता है। आपके मामले में, 'que' 'null' है। आपको बस अपनी विधियों में एक ही वस्तु को लॉक करने की आवश्यकता है। – SLaks