2010-01-28 2 views
0

Windows Form에서 컨트롤을 만든 스레드에서 다른 스레드에서 이벤트가 트리거되는 위치를 읽었습니다.이벤트 처리기는 현재 개체를 매개 변수로 사용할 수 있습니까?

따라서 이벤트 핸들러는 버튼의 색상 변경과 같이 컨트롤을 직접 업데이트 할 수 없습니다.

Invoke 또는 BeginInvoke가 필요하다는 설명을 읽었습니다.

내 질문 : 왜 이벤트 처리기가 'this'를 악기로 전달할 수 없습니까?

'this'는 컨트롤의 색상을 변경하려는 버튼이있는 양식입니다. ;)

내가 대리자는 '이'를 취할 수 인스턴스를 본 적이 맹세 할 수

- 그냥 가서 주변에 나사 다른 스레드에서 이벤트 핸들러를 중지 어디에도 없지만 아마 ...

+0

이벤트가 항상 다른 스레드에서 트리거되는 것이 걱정된다면, 대부분의 시간은 쉬지 않을 것입니다. 특히 사용자 작업에 의해 트리거되는 이벤트의 경우 –

답변

1

버튼의 내부 상태

그러나 나쁜 일이 발생합니다. 예를 들어, 뭔가 다른 사람이 컨트롤에 쓰기를 시도하는 동안 컨트롤 속성을 변경하면 어떻게 될까요?

한 번에 하나의 스레드 만 개체의 내부 상태로 돌아 가야합니다. 다른 스레드에서 해당 개체에 직접 메서드를 호출하면 다른 스레드가 동일한 작업을 수행하지 않는다고 보장 할 수 없습니다.

Invoke는 직접 호출하지 않고이 객체를 "소유"하는 스레드에 대해 말합니다. "잠시만 기다려 주면 객체에서이 메서드를 호출 할 수 있습니까?" 객체가 일관된 상태에있을 때만 메소드가 호출됩니다.

+0

우수한 - 감사합니다! – Joe

1

양식의 인스턴스 메소드로 이벤트를 처리하는 경우 이미 "this"매개 변수가 있습니다.

Public Class MyForm 
    Inherits Form 

    Private port As New SerialPort() 

    Private Sub RegisterHandlers() 
     AddHandler port.DataReceived, AddressOf ProcessData 
    End Sub 

    Private Sub ProcessData(ByVal sender As Object, ByVal e As EventArgs) 
     If Me.InvokeRequired Then 
      'marshal to required thread 
      Exit Sub 
     End If 

     'do stuff on the form thread 
    End Sub 
End Class 
+0

예, 'this'매개 변수가 있지만 직접 사용하려고했습니다. 분명히, 아니오. 그래서 나는 이벤트 핸들러를 정적 함수로 만들려고 했으므로 arg 목록에 'this'가 필요하다. 그렇습니다. 호출이 핵심입니다. 감사. – Joe

관련 문제