你需要編寫自己的適配器類 - 是這樣的:
public class ConcurrentDictionaryWrapper<TKey,TValue> : IProducerConsumerCollection<KeyValuePair<TKey,TValue>>
{
private ConcurrentDictionary<TKey, TValue> dictionary;
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
{
return dictionary.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public void CopyTo(Array array, int index)
{
throw new NotImplementedException();
}
public int Count
{
get { return dictionary.Count; }
}
public object SyncRoot
{
get { return this; }
}
public bool IsSynchronized
{
get { return true; }
}
public void CopyTo(KeyValuePair<TKey, TValue>[] array, int index)
{
throw new NotImplementedException();
}
public bool TryAdd(KeyValuePair<TKey, TValue> item)
{
return dictionary.TryAdd(item.Key, item.Value);
}
public bool TryTake(out KeyValuePair<TKey, TValue> item)
{
item = dictionary.FirstOrDefault();
TValue value;
return dictionary.TryRemove(item.Key, out value);
}
public KeyValuePair<TKey, TValue>[] ToArray()
{
throw new NotImplementedException();
}
}
詞典(和併發詞典)也不會保留項目的順序。你能描述你的生產者 - 消費者情景嗎? – Dennis
@丹尼斯,我知道這一點。生產者在concurrentDictionary中存儲KeyValuePairs,並且消費者任務增加一個int值,並且如果int與相應的密鑰匹配,則刪除KeyValuePair。我這樣做是因爲工作任務使用值填充concurrentDictionary,但以任意順序,使用者任務確保接收到的值以正確的順序傳遞/處理。一個ConcurrentDictionary是否可以封裝在BlockingCollection中? –
你提出了什麼解決方案?我試圖找到一個很好的解決方案來解決類似的問題,即生產者不按消費者所需的順序生產物品。 (舊帖子我知道,但值得一試) – Kim