2016-12-02 37 views
-1

AddSafe方法是否真的線程安全或我所做的是錯誤的?我的收藏線程安全嗎?

public static MyCollection myCol = new MyCollection(); 

class MyCollection: ObservableCollection<string> 
{ 
    public void AddSafe(string item) 
    { 
     lock(this) 
     { 
      this.Add(item); 
     } 
    } 
} 
+1

http://stackoverflow.com/questions/23108045/how-to-make-observablecollection-thread-safe檢查此! – TripleEEE

+0

從鏈接檢查羅伯特弗雷澤的答案! – mybirthname

回答

0

如何刪除/ acces,它不僅是關於添加?但閱讀項目也應該鎖定。


有設計一個小問題:您正在使用的主要是使用的GUI的ObservableCollection

我勸你不使用ObservableCollection<>其他線程不是GUI線程。在「gui」線程之外​​的其他線程上觸發時,正在「偵聽」事件的控件將會崩潰。當更改ObservableCollection中的項目時,應該在分派器上調用它。這樣你的收藏就是線程安全的。 (因爲不使用它錯扣的)

public class MyControl: UserControl 
{ 

    private void MyMethodCalledFromAnOtherThread() 
    { 
     this.Dispatcher.Invoke(new Action(
     { 
      // Change the collection... 
      myCol.Add("Hi there"); 
     }); 
    } 
+0

是的,它不僅僅是添加,我只是一般地問。我在單獨的線程中讀取數據表單套接字,所以我不能在GUI線程中執行此操作。 –

+0

您不應該在套接字線程的observablecollection中寫入數據。使用'dispather.invoke'來同步socker線程和gui線程。甚至更好。使用隊列存儲接收到的由套接字線程排隊的消息,並使用DispatcherTimer處理隊列。這樣套接字線程不會推動GUI線程。 –