그래서 별도의 스레드를 구현하는 데 문제가 있습니다. 이것은 간단한 클래스를 가지고 있기 때문에 새로운 스레드를 시작하기 때문입니다. 그래서 폼이 아니기 때문에 UI Thread에서 함수를 호출하는 방법을 찾지 못했습니다.스레딩 : 별도 스레드 (VS2010)에서 대리자를 호출
따라서 Invoke
방법을 사용할 수 없습니다. 다른 스레드에서 함수를 호출 할 수있는 방법이 있습니까?
그래서 별도의 스레드를 구현하는 데 문제가 있습니다. 이것은 간단한 클래스를 가지고 있기 때문에 새로운 스레드를 시작하기 때문입니다. 그래서 폼이 아니기 때문에 UI Thread에서 함수를 호출하는 방법을 찾지 못했습니다.스레딩 : 별도 스레드 (VS2010)에서 대리자를 호출
따라서 Invoke
방법을 사용할 수 없습니다. 다른 스레드에서 함수를 호출 할 수있는 방법이 있습니까?
클래스에서 노출 된 이벤트가 있고 UI 스레드에서 이벤트 처리기를 실행한다고 가정합니다. 호출자가 지정한 콜백을 가질 수 있다고 가정합니다. 어느 쪽이든 아래에서 설명 할 패턴은 두 경우 모두 작동합니다.
이 경우 발생하는 한 가지 방법은 클래스에 ISynchronizeInvoke
인스턴스를 허용하는 것입니다. Form
및 Control
인스턴스는이 인터페이스를 구현하므로 그 중 하나에 대한 참조를 사용할 수 있습니다. 인스턴스가 지정되지 않은 경우 클래스의 이벤트를 발생시켜 실행되는 이벤트 핸들러는 ISynchronizeInvoke
인스턴스 (일반적으로 양식 또는 컨트롤)를 호스팅하는 스레드 대신 작업자 스레드에서 실행되는 규칙을 만들 수 있습니다.
Public Class YourClass
Private m_SynchronizingObject As ISynchronizeInvoke = Nothing
Public Sub New(ByVal synchronizingObject As ISynchronizeInvoke)
m_SynchronizingObject = synchronizingObject
End Sub
Public Property SynchronizingObject As ISynchronizeInvoke
Get
Return m_SynchronizingObject
End Get
Set(ByVal value As ISynchronizeInvoke)
m_SynchronizingObject = value
End Set
End Property
Private Sub SomeMethodExecutingOnWorkerThread()
RaiseSomeEvent()
End
Private Sub RaiseSomeEvent()
If Not SychronizingObject Is Nothing AndAlso SynchronizingObject.InvokeRequired Then
SynchronizingObject.Invoke(New MethodInvoker(AddressOf RaiseSomeEvent)
End If
RaiseEvent SomeEvent
End Sub
End Class
먼저주의해야 할 점은 동기화 개체를 지정할 필요가 없다는 것입니다. 즉, Form
또는 Control
참조가 필요하지 않습니다. 지정하지 않으면 작업자 스레드에서 SomeEvent
이 발생합니다. 이것은 System.Timers.Timer
클래스에서 사용되는 것과 동일한 패턴입니다.
감사합니다. 지금 양식 참조를 요청하고 있습니다. :) –
클래스에서 일부 이벤트를 노출하고 UI에 알릴 필요가있을 때 실행하고 이벤트가 시작될 때 UI 구성 요소를 마지막으로 등록하면 수신기 메소드가 실행됩니다. Control.Invoke 또는 Control.BeginInvoke를 사용하여 UI 스레드에서 코드를 실행할 수 있습니다.
컨트롤에서 '호출'또는 'BeginInvoke'를 호출 할 수없는 이유는 무엇입니까? –
나는 컨트롤이 없기 때문에. 제가 개발중인 도서관입니다. :) –
컨트롤이 생성 된 스레드에서 대리자를 호출해야하는 경우 스레드가 무엇인지 파악해야합니다. 가장 쉬운 방법은 라이브러리 사용자가 생성자에서 개체에 대한 컨트롤에 대한 참조를 전달하거나 속성을 설정하는 것입니다. –