2012-04-11 3 views
1

소켓이있는 클래스가 있으며 클라이언트에서 데이터 수신을 수신합니다. 새 데이터를 수신하면 이벤트를 호출 (구현 된 경우)하지만 모든 연결에 자체 스레드가 있다는 것을 알고 있으므로 해당 스레드에서 이벤트가 실행되고 나머지는 알고 있습니다. 양식 컨트롤로는 작업 할 수 없습니다. 어떻게 이벤트를 호출 (또는 호출)합니까? 나는 쓰레드와 네트워크 프로그래밍에있어서 정말 새로운 것이므로 어떠한 예도 고맙게 생각한다.C#의 다른 스레드에서 구현되는 호출 이벤트

public class HVremotechooser 
{ 
    public delegate void NewOrder(Order order); 
    public event NewOrder nOrder; 

    //... (code elided) 


    public void ReceiveCallback(IAsyncResult AsyncCall) // new connection of client 
    { 

     //... (code elided) 
     if (nOrder != null) 
       nOrder(Order); // calling the event "nOrder" 
     //... (code elided) 

    } 

} 

감사합니다.

+1

winforms 질문입니까? 나는 당신이 "내가 UI 스레드에서 호출을 호출하는 방법"을 묻고 있다고 생각합니다. http://stackoverflow.com/questions/142003/cross-thread-operation-not-valid-control-accessed-from-a-thread-other-than-the – roken

답변

1

, 당신은 호출해야합니다 : 윈도우 형태로, 그것은 (나도이 일을해야한다고 생각하지만) 대신 Control.BeginInvoke를 사용하는 것이 더 쉬울 수 있습니다처럼 보인다 행동. 내가 평소하는 것은 다음과 같습니다

private void LongRunningBackgroundThread() { 
    // lots of work 
    ... 
    // Update my form 
    InvokeIfRequired(() => { 
     ...update form... 
    } 
} 

private static void InvokeIfRequired(Action a) { 
    if (control.InvokeRequired) { 
     control.Invoke(a); 
    } else { 
     a(); 
    } 
} 

당신은 UI 스레드에 대리자의 실행을 주입하는 Invoke 또는 BeginInvoke 같은 전형적인 marshling 작업을 사용할 수 있습니다 herehere

+0

나는 이것을 알고 있지만 내 경우에는 유용하지 않다. 나는 마녀에게 몇 가지 사건이 있음을 프로그램한다. 내 구성 요소를 사용하는 프로그래머는 이벤트를 구현할 것이고 나는 invoke (스레드)에 신경 쓰고 싶지는 않을 것이다. – hamid

+0

세 번째 프로그래머가 양식 요소로 쉽게 작업을 수행 할 수 있도록 구현 된 이벤트를 호출해야합니다. – hamid

0

를 참조하십시오. 마샬링을 용이하게하려면 클래스에 ISynchronizeInvoke 또는 SynchronizationContext의 인스턴스를 전달하십시오.

그러나 귀하의 경우에는 그렇게하지 않습니다. 어쨌든 소켓 이벤트로 인해 이러한 콜백이 발생하기 때문에 가능 가능성이 높습니다. 당신은 분명히 모든 활동과 함께 UI 스레드를 슬램하고 싶지는 않습니다. 대신 적절한 모든 데이터를 패키지화하고 UI 스레드가보다 합리적인 간격으로 System.Windows.Forms.Timer을 사용하여 폴링 할 수있는 콜렉션에 넣으십시오.

이러한 마샬링 작업을 항상 수행합니다. 그들은 과대 평가되고 남용되고 있습니다. UI와 작업자 스레드간에 데이터를 공유하고 신호를 보내는 두 가지 일반적인 방법이 있음을 기억하십시오. 작업자 글 Invoke 또는 BeginInvoke 통해

  • 푸시 방법
  • 풀 UI 스레드

견인 법이 될 수있는 System.Windows.Forms.Timer 비아있어서, 종종, 더 고급.

0

UI 스레딩은 UI 관련 문제입니다. 제 생각에는이 코드에서 UI 스레드를 호출하는 것에 대해 걱정할 필요가 없습니다. 오히려 이벤트 소비자는 Invoke을 수행해야합니다. 또는 다른 스레딩 물건을해야합니다. 그런 식으로 UI 사용자가 자신의 전략을 변경해야하는 경우 (예 : 타이머 사용) 비 UI 관련 코드를 변경하지 않아도됩니다.

관련 문제