簡體   English   中英

C# 線程鎖定問題

[英]C# Thread Locking Problem

我正在創建一個有 2 個類的解決方案

Class A 有一個公共 static 列表 object 即public static List<MyClass> classes = new List<MyClass>(); Class B 具有使用 System.Threading.Timer 運行的方法,並在時間間隔上調用 class A 的方法

Class A 有兩種方法 方法 1:更新 static 列表 - 查找項目並增加其屬性,例如

classes[0].Id = i++;

方法二:返回 static 列表

但是我不斷收到無法修改列表的異常。

我想確保一次只有一種方法鎖定類 object。 我能做些什么來實現它? lock(this) 或 lock(classes) 不起作用。

例外是沿着線

list cannot be modifed when it is being enumerated.

它指向classes[0].Id遞增的行

代碼是:

for (int i = 0; i< classes.Count;i++)
{
if (classes[i].Name == this.NameToFind)
{
classes[i].Id = n++;
}

}

請注意,我想修改類列表 object,因為其他方法正在返回更新的 object。

根據對答案的一些評論 Class A 是 Wcf 服務和 class B 是消費服務。 這些細節可能很重要,因為返回的任何內容都經過序列化。

根據您對異常的描述,我認為我們缺少細節。 如果沒有使用枚舉器的東西,你不應該得到那個錯誤。

As to locking, it sounds like you need a private static object to lock on (since I'm guessing you want to synchronize operations on that static list across instanced wcf calls), but it depends on how you setup your wcf concurrency mode. 可能有比下面的示例更有效的方法來處理同步,但據我所知,這是我所能做的。 確保任何涉及私人列表的內容都在 static 鎖內進行。 您可能應該查看讀寫器超薄鎖http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx

(手寫)

class A
{
     private static readonly object listLock = new object();
     private static List<MyClass> classes = new List<MyClass>();

     public void Method1()
     {
          lock(listLock)
          {
               //update here
          }
     }

     public List<MyClass> Method2()
     {
          lock(listLock)
          {
               return classes;
          }
     }

}

聽起來 class A 應該減少它的內部結構。 你沒有對設計說太多,但是這個(或類似的工作)

class A{
  List<MyClass> _list = new List<MyClass>();
  object _lock = new object();
  public void Increment(int index){
     lock(_lock) {/*find item and increment */}
  } 
}

Ideally there would be no static state, B (your message pump) would have access directly or via an interface to an instance of A. If you really need static then make _list and _lock static (but I don't like that).

如前所述,需要有關異常的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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