2014-11-01 1 views
1

winform 응용 프로그램을 콘솔 응용 프로그램으로 변환하려고합니다. Winform 응용 프로그램에는 대리자 처리기가 있습니다. 콘솔 응용 프로그램에서 동일한 기능을 어떻게 작성합니까? 이것의 대안은 무엇입니까 .InvokeRequired 및이 .InvokeInvoke를 사용하는 방법 콘솔 응용 프로그램에서 필수 호출?

public delegate void DelegateMessage(string Reply); 
_pipeServer.PipeMessage += new DelegateMessage(PipesMessageHandler); 

      private void PipesMessageHandler(string message) 
     { 
      try 
      { 
       if (this.InvokeRequired) 
       { 
        this.Invoke(new NewMessageDelegate(PipesMessageHandler), message); 
       } 
       else 
       { 
        txtMessage.Text = message; 
       } 
      } 
      catch (Exception ex) 
      { 

       Debug.WriteLine(ex.Message); 
      } 

     } 
+0

사과와 오렌지. GUI 앱과 '콘솔 앱'을 포함한 비 GUI 앱의 차이점은 후자는 ** 메시지 펌프가 아니라 **입니다. 어떻게 든 '콘솔 앱'에 GUI를 올바르게 표시하면 정의에 따라 GUI 응용 프로그램이됩니다! – MickyD

답변

4

당신은 그렇지 않습니다.

Invoke -access-threads 기계는 Windows 메시지 루프 위에 구축됩니다.

크로스 스레드 호출이 정말로 필요한 경우 할 수있는 일은 숨겨진 창을 만들고 메시지 루프를 시작하는 것입니다 (UI를 사용하고 콘솔을 함께 사용하는 것은 상호 배타적이지 않습니다). 작업을 수행하고 콘솔에서 결과를 표시하고, 메인 스레드에서 다시 작업을 수행 할 필요가있을 때 Invoke를 사용하십시오.

하지만 UI가없는 경우 주 스레드에서 작업을 수행해야하는 주된 이유가 사라졌습니다. "InvokeRequired에 해당하는 항목은 무엇입니까?" TextBox에 해당하는 것을 먼저 찾지 않아도됩니다.

+0

답장을 보내 주셔서 감사합니다. Textbox는 메시지를 표시하기 만하면 메시지를 표시하는 대신 명명 된 파이프로 메시지를 보냅니다. 그러나 메시지를 청취하는 이벤트 기능이 호출하고 호출해야합니다. 그래서 어떻게해야할지 모르겠다. –

+0

@ Shiv : 'Invoke'는 명명 된 파이프에 쓰는 데는 절대 필요하지 않다. –

+0

알다시피, 그것을 사용하고있는 샘플 코드에 델리게이트가 있습니다. 그래서 내가 왜 그랬는지. –

관련 문제