簡體   English   中英

如何確保一次只有一個線程可以訪問集合類型的實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM