---
# System prepended metadata

title: C# List をスレッドセーフに取り扱うには、`System.Collections.ICollection`インターフェイスの`SyncRoot`を使用する 2021-07-28
tags: [スレッドセーフ, C#, System.Collections.ICollection, List<>, SyncRoot]

---

---
lang: ja-jp
breaks: true
---
# C# List をスレッドセーフに取り扱うには、`System.Collections.ICollection`インターフェイスの`SyncRoot`を使用する 2021-07-28

```csharp=
List<string> lstDelete = new List<string>();
Parallel.ForEach(this.m_dicPhysicalAddress.Keys, key =>
    {
        if (hasPAddress.Contains(key) == false)
        {
            lock (((System.Collections.ICollection)lstDelete).SyncRoot)
            {
                lstDelete.Add(key);
            }
        }
    });
    
Parallel.ForEach(lstDelete, key =>
    {
        ClientPhysicalAddressDataSet.ClientRow rowDs = null;
        this.m_dicPhysicalAddress.TryRemove(key, out rowDs);
    });
```

:::warning
この方法は、Dictionary では使用できない。利用するとエラーとなる。
:::

###### tags: `C#` `List<>` `スレッドセーフ` `System.Collections.ICollection` `SyncRoot`
