2009-04-11 10 views
0

일부 기본적인 스레딩을 수행하는 서버 프로그램을 작성 중입니다. 일부 UI 컨트롤을 업데이트해야하며 모든 항목이 스레드로부터 안전하도록 대리자를 사용하는 방법을 배웠습니다. 예를 들어, 다음 날 스레드에서 TextBox 컨트롤을 업데이트 할 수 있습니다 내 대리인의 :.NET의 스레드에서 카운터 업데이트

Private Delegate Sub AddMessageToTXTDelegate(ByVal lst As TextBox, ByVal str1 As String) 
Private Sub AddMessageToTXT(ByVal txt As TextBox, ByVal str1 As String) 
    Try 
     If Me.InvokeRequired Then 
      Dim addTXT As New AddMessageToTXTDelegate(AddressOf AddMessageToTXT) 
      Me.BeginInvoke(addTXT, New Object() {txt, str1}) 
     Else 
      txt.Text = str1 
     End If 
    Catch ex As Exception 
     Console.WriteLine(ex.Message) 
     Throw (ex) 
    End Try 
End Sub 

가 지금은 카운터를 업데이트해야와 나는 같은 패턴이 적용됩니다 생각. 다음 대표단을 구성했습니다.

Private Delegate Sub IncrementCounterDelegate(ByVal ctr As Integer) 
Private Sub IncrementCounter(ByVal ctr As Integer) 
    Try 
     If Me.InvokeRequired Then 
      Dim incCtr As New IncrementCounterDelegate(AddressOf IncrementCounter) 
      Me.BeginInvoke(incCtr, New Object() {ctr}) 
     Else 
      ctr += 1 
     End If 
    Catch ex As Exception 
     Console.WriteLine(ex.Message) 
     Throw (ex) 
    End Try 
End Sub 

내 카운터가 증가하지 않는 것이 문제입니다. 디버그로 이것을 추적하면 "ctr + = 1"문이 실행되지만 실제 카운터는 0으로 유지됩니다. 카운터를 통과시켜야한다고 생각합니다.

누구든지 여기에 조언을 제공 할 수 있습니까? 감사! CBF

답변

1

System.Threading.Interlocked.Increment을 사용하여 달성 될 수있는 정수를 증가 스레드 안전한 방법 \

. 이것을 사용하고 대리인을 피해야합니다.

편집

나는 당신의 대리자를 사용하려고 시도하는 이유를 모르겠어요. 모든 스레드에서 수행 할 수있는 값 개체를 증가시킵니다. 다른 스레드에서 UI 컨트롤을 업데이트 할 수 없습니다.

이 스레드 안전을 설정하려면 모니터를 사용하여 잠금을 도입하거나 (예를 들어) 인터록 된 Increment 메서드를 사용해야합니다.

1

값을 기준으로 카운터를 전달하므로 ctr += 1은 함수의 인수를 증가시킵니다. 참조를 통해 카운터를 전달하거나 비공개 필드를 InterlockedIncrement으로 증가시켜야합니다. 위임자가 없거나 필요하지 않습니다.

관련 문제