2011-03-29 4 views
1

를 제어 나는 다음과 같은 기능액션을 호출하는 방법 <> 수정 윈폼은

private void UnsubscribeSubscribe(Action action) 
    { 
     action.BeginInvoke(action.EndInvoke, null); 
    } 

내 컨트롤을 데이터 소스 아무 일도 발생하지 않습니다 수정하는 조치를 통과 할 때마다에게 있습니다. 실행중인 쿼리가 결과를 반환하기 때문에 작업이 호출되고 있음을 알고 있습니다. WinForm 컨트롤을 추가 한 동일한 스레드에서만 winform 컨트롤을 수정할 수 있다는 것을 읽었습니다. 이 작품을 어떻게 만들 수 있습니까?

예를 들어, 실행중인 UnsubscribeSubscribe (>) {> Foobar.DataSource = GetResults()});

GetResults()이 제대로 실행되지만 데이터 소스는 변경되지 않습니다.

답변

5

컨트롤의 기본 핸들을 만든 스레드에서 대리자를 호출해야합니다. Control.BeginInvoke이 사용됩니다.

3

잘못된 방법을 사용하고 있습니다. 대리자의 BeginInvoke() 메서드는 스레드 풀 스레드에서 대리자 대상을 항상 실행합니다. 사용자 인터페이스에 대한 독. Control.BeginInvoke()를 사용해야합니다. 양식의 BeginInvoke 메소드와 같습니다. 마찬가지로 이름이 있지만 은 없습니다.은 대리인의 BeginInvoke() 메서드와 관련이 없습니다. 하나는 EndInvoke()를 호출 할 필요가 없습니다.

2

당신은 그 GUI 스레드가 다음 (이 예는 텍스트 상자입니다 - msdn에서)이 같은 Invoke 방법을 사용해야하는 다른 스레드에서 UI 스레드에서 작업을해야하는 경우 :이

private void SetText(string text) 
{ 
    // InvokeRequired required compares the thread ID of the 
    // calling thread to the thread ID of the creating thread. 
    // If these threads are different, it returns true. 
    if (this.textBox1.InvokeRequired) 
    { 
    SetTextCallback d = new SetTextCallback(SetText); 
    this.Invoke(d, new object[] { text }); 
    } 
    else 
    { 
    this.textBox1.Text = text; 
    } 
} 

SynchronizationContext 클래스를 사용하는 또 다른 접근법입니다. 사용법에 대해 읽을 수 있습니다. here

+0

수정 링크 주셔서 감사합니다. – Mike

관련 문제