2016-12-02 2 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

제거/액세스는 어떨까요? 그러나 읽는 항목도 잠 가야합니다.


설계에 의해 약간의 문제가있다 : 당신은 대부분 GUI에 의해 사용되는 ObservableCollection을 사용하고 있습니다.

난 당신이 는 GUI 스레드가 아닌ObservableCollection<>에서 다른 스레드를 사용하지 않는 것이 좋습니다. 이벤트를 '듣는'컨트롤은 GUI 스레드가 아닌 다른 스레드에서 트리거 될 때 고장납니다. ObservableCollection에서 항목을 변경하는 경우 Dispatcher에서 호출해야합니다. 이렇게하면 콜렉션이 스레드 세이프가됩니다.

의사 (그것은 크로스 스레딩을 사용하지 않는 때문에)

public class MyControl: UserControl 
{ 

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

네, 덧붙일뿐 아니라, 제가 일반적으로 묻는 것입니다. 별도의 스레드에서 데이터 형식 소켓을 읽고 GUI 스레드에서이 작업을 수행 할 수 없습니다. –

+0

소켓 스레드에서 observablecollection에 쓸 수 없습니다. socker 쓰레드와 gui 쓰레드를 동기화하기 위해'dispather.invoke'를 사용하십시오. 또는 더 나은. 큐를 사용하여 소켓 스레드에 의해 큐에 대기 된 수신 메시지를 저장하고 DispatcherTimer를 사용하여 큐를 처리하십시오. 이 방법은 소켓 스레드가 GUI 스레드를 푸시하지 않습니다. –

관련 문제