2011-06-10 5 views
0

그래서 별도의 스레드를 구현하는 데 문제가 있습니다. 이것은 간단한 클래스를 가지고 있기 때문에 새로운 스레드를 시작하기 때문입니다. 그래서 폼이 아니기 때문에 UI Thread에서 함수를 호출하는 방법을 찾지 못했습니다.스레딩 : 별도 스레드 (VS2010)에서 대리자를 호출

따라서 Invoke 방법을 사용할 수 없습니다. 다른 스레드에서 함수를 호출 할 수있는 방법이 있습니까?

+0

컨트롤에서 '호출'또는 'BeginInvoke'를 호출 할 수없는 이유는 무엇입니까? –

+0

나는 컨트롤이 없기 때문에. 제가 개발중인 도서관입니다. :) –

+0

컨트롤이 생성 된 스레드에서 대리자를 호출해야하는 경우 스레드가 무엇인지 파악해야합니다. 가장 쉬운 방법은 라이브러리 사용자가 생성자에서 개체에 대한 컨트롤에 대한 참조를 전달하거나 속성을 설정하는 것입니다. –

답변

0

클래스에서 노출 된 이벤트가 있고 UI 스레드에서 이벤트 처리기를 실행한다고 가정합니다. 호출자가 지정한 콜백을 가질 수 있다고 가정합니다. 어느 쪽이든 아래에서 설명 할 패턴은 두 경우 모두 작동합니다.

이 경우 발생하는 한 가지 방법은 클래스에 ISynchronizeInvoke 인스턴스를 허용하는 것입니다. FormControl 인스턴스는이 인터페이스를 구현하므로 그 중 하나에 대한 참조를 사용할 수 있습니다. 인스턴스가 지정되지 않은 경우 클래스의 이벤트를 발생시켜 실행되는 이벤트 핸들러는 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 클래스에서 사용되는 것과 동일한 패턴입니다.

+0

감사합니다. 지금 양식 참조를 요청하고 있습니다. :) –

0

클래스에서 일부 이벤트를 노출하고 UI에 알릴 필요가있을 때 실행하고 이벤트가 시작될 때 UI 구성 요소를 마지막으로 등록하면 수신기 메소드가 실행됩니다. Control.Invoke 또는 Control.BeginInvoke를 사용하여 UI 스레드에서 코드를 실행할 수 있습니다.

관련 문제