我記得我看到一個有 2 個令人興奮的屬性的類。我不記得類名,但我認為這是一個集合,我不確定。第一個屬性名為 Read*word*,第二個屬性名為 Write*word*。可惜我不記得了。讓我嘗試解釋為什么存在這兩個屬性。這個想法是當發生寫入時,我們允許已經運行的“讀取”完成,但新的需要等待。請參閱下面如何使用此類。
var list = new ThreadSafeList();
// This is how we should read the collection.
using(var read = list.ReadLock)
{
// If a write is happening we will wait until it finishes.
await read.WaitAsync();
// Do something with the list. If we are here in the execution no writing can happen, only reads.
}
// This is how we should change the collection.
using(var write = list.WriteLock)
{
await write.WaitAsync();
// Modify the collection, nobody reads it, so we are safe.
}
我記得對嗎?是否有具有相似屬性的集合?如果沒有,有人可以告訴我應該如何制作一個類似的類,這是 AutoResetEvent 還是 ManualResetEvent 可能是 Sempahore?我不知道。
uj5u.com熱心網友回復:
這個想法是當發生寫入時,我們允許已經運行的“讀取”完成,但新的需要等待。請參閱下面如何使用此類。
對我來說,這聽起來像是一個讀寫器鎖。讀取器/寫入器鎖可以與集合一起使用,盡管鎖本身不包含專案。
BCL 中有一個同步讀寫器鎖。但是,沒有異步版本。
通常,當人們要求讀/寫鎖時,我會要求他們仔細考慮是否真的需要它。只是你有一些代碼充當閱讀器和其他代碼充當撰寫器這一事實并不意味著你應該有一個讀/寫鎖。RWL 可能是最被濫用的同步原語之一。一個簡單的lock(或SemaphoreSlim異步情況下)通常就足夠了。
是否有具有相似屬性的集合?
當然有可用的讀者/作家收藏。這些通過包含許多專案來作業,并允許代碼的不同部分生產或使用專案。因此,通用名稱“生產者/消費者”集合。
這些天我推薦的是System.Threading.Channels。TPL 資料流是另一種選擇。
請注意,您不必對 Channels/Dataflow 進行任何鎖定。您的生產者只生產資料項,而您的消費者只消費它們。所有鎖定都在這些集合內部。
如果沒有,有人可以告訴我應該如何開設類似的課程
如果經過仔細考慮,你真的想要一個異步讀寫器鎖,你可以做一個這樣的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/505420.html
上一篇:如何操作串列中的字串?
