2016-08-05 6 views
1

왜 콜백을 구현하는 Windows Form이 작동하지 않는지에 대해 머리를 감싸려고합니다.SynchronizationContext의 콜백

내가 할 노력하고있어

:

  • A 버튼을 누르면 및 서비스가 호출됩니다.

    [CallbackBehavior(UseSynchronizationContext = false)] 
    public class DeliveryClient : System.Windows.Forms.Form, ICallback 
    {   
         public void ServiceCallback(string system, string state, string extraInfo) 
         { 
          if (state == "start") 
          { 
           Invoke((MethodInvoker)delegate { picBox.Visible = true; }); 
          } 
          else 
          { 
           Invoke((MethodInvoker)delegate { picBox.Visible = false; }); 
          } 
         } 
    } 
    
    :
  • 서비스는 형태로 다시 호출
  • 양식 업데이트 GUI 그에 따라 거짓에 UseSynchronizationContext을 갖고, GUI 회원에 호출을 호출

잘 작동 (함수는 = 사실 IsOneWay가있다) 멤버를 호출

그러나 UseSynchronizationContext = true를 직접하지 않습니다 :

[CallbackBehavior(UseSynchronizationContext = true)] 
public class DeliveryClient : System.Windows.Forms.Form, ICallback 
{   
     public void ServiceCallback(string system, string state, string extraInfo) 
     { 
      if (state == "start") 
      { 
       picBox.Visible = true; 
      } 
      else 
      { 
       picBox.Visible = false; 
      } 
     } 

어느 두 번째와 세 번째 버전도 작동해야 문자 그대로

SynchronizationContext.Current.Send(_=> picBox.Visible = true, null); 

SyynchronizationContext를 사용합니까? OneWay라고하는 콜백이므로 콜백 후에도 서비스가 계속됩니다.

답변

1

은 WCF로 (당신은 WCF 클라이언트에서 위임 즉, 단지 뭔가를) 그것을 알고, 당신의 Form 정말 클래스 당신의 WCF 서비스 클라이언트 콜백의 구현인가? 그렇지 않은 경우 [CallbackBehavior] 속성을 잘못된 위치에 넣었습니다. 문서는 상태로 :

는 클라이언트 콜백의 구현은 다음 좋은 Minimal, Complete, and Verifiable code example없이 난 두려워 인 경우 CallbackBehaviorAttribute 콜백 계약

를 구현하는 클래스에 적용해야합니다

I 속성이 예상되는 효과를 내지 못하는 이유를 말할 수 없습니다. 하지만 내가 일 경우은 실제로 그런 경우 코드가 잘못 설계되었다고 말할 수 있습니다. UI를 서비스 클라이언트 콜백 구현과 결합하면 정상적인 코드에 대한 여러 가지 OOP 원칙이 위반되지만 가장 중요한 것은 Separation of Concerns 원칙입니다.

이가는 지금까지 같이

당신이 SynchronizationContext를 사용하는 방법이 아니다
SynchronizationContext.Current.Send(_=> picBox.Visible = true, null); 

. Current 속성은 현재 실행중인 스레드의 컨텍스트를 반환합니다. Send()에 전화 할 때가 지 너무 늦어 문맥을 검색 할 수 없습니다. Send()에 의해 호출 된 위임을 원하는 스레드에서 개체를 만들 때 SynchronizationContext.Current을 저장해야합니다. 물론 해당 스레드는 Winforms 프로그램의 기본 UI 스레드에있는 유용한 컨텍스트를 가져야합니다).

위 코드로 코드를 작동시키기에 충분한 정보가 제공되지 않는 경우 문제를 확실하게 재현 할 수있는 좋은 MCVE를 제공하여 문제를 개선하십시오.

+0

callbackbehavior가 올바르게 배치됩니다. 올바른 경우 양식에서 콜백을 구현합니다.나는 지금 SynContext를 저장하려고 시도 할 것이다. – Laurijssen

+0

사실, InitializeComponent가 작동 한 후에 SynContext를 저장한다. – Laurijssen

+0

나는 실제로 관심사의 sep에 동의하지 않는다. 양식을 업데이트하는 것이 유일한 목적 인 콜백을 구현하는 양식 – Laurijssen