[英]how to ensure only one thread can access an instance of a collection type at a time
我的代碼(C#)中有幾個地方會修改隊列或列表。 我想確保在任何時候都只有一個線程修改隊列或列表。 那么如何在C#中保持其一致性呢? 謝謝
編輯請在WPF應用程序的主線程上查看示例代碼COMException
在訪問或修改隊列或列表時,按住一個互斥鎖。
使用lock
語句。
lock(myObject) {
//Code
}
System.Collections.Concurrent命名空間和框架中的其他地方有幾種可用的線程安全類型。 使用這些可能是最簡單的選擇。
您也可以使用lock
語句執行自己的顯式鎖定。 例如
public class Foo
{
private readonly List<int> list = new List<int>();
private readonly object locker = new object();
public void SomeCommand(Bar bar)
{
lock (this.locker)
{
// do something here?
this.list.Add(..);
// do something here?
}
}
public Baz SomeQuery()
{
lock (this.locker)
{
// do something here?
this.list.Select(...);
// do something here?
}
}
public void SomethingElseEntirely()
{
lock (this.locker)
{
// do something here
}
}
}
最佳選擇因情況而異。 例如,您是否還希望同步除集合操作之外的其他操作(如代碼示例中所示),是否要對性能進行調整,以使讀取次數多於寫入次數,或者寫入次數多於讀取次數(某些內置類型已在其中進行調整這些方式),等等。
您還可以嘗試使用其他顯式線程同步類型,例如ReaderWriterLockSlim ,該類型針對讀取多於寫入進行了優化,並查看最適合您的方案的情況。
如果您使用的是.NET 3或更高版本,則最簡單的解決方案是使用SynchronizedCollection 。
最好使用內置的線程安全集合,例如ConcurrentQueue 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.