2016-10-25 2 views
0

각 작업이 실행 된 후 클라이언트에 메시지를 보내는 WCF 서비스를 실행하는 동안 WPF UI를 업데이트하는 데 문제가 있습니다. WSDualHttpBinding을 사용합니다. 서비스에서 온 각 메시지에 대한 메시지 상자를 표시하면 동일한 구현이 완벽하게 작동합니다. 그러나 이것은 UI 업데이트에 작동하지 않습니다.WCF 콜백 메시지로 WPF UI에 알립니다.

PS : I는 MVVM 패턴을 사용 Caliburn.micro 내 구현 간략화 :

1- 인터페이스 :

public interface IMyContractCallback 
{ 
    [OperationContract] 
    void OnCallback(); 
} 


[ServiceContract(CallbackContract = typeof(IMyContractCallback))] 
public interface IMyContract 
{ 
    [OperationContract] 
    void DoSomething(); 
} 

2- 서비스 :

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)] 
public class MyService : IMyContract 
{ 
    public void DoSomething() 
    { 
     DoJob1(); 
     var callbackChannel = OperationContext.Current.GetCallbackChannel<IMyContractCallback>(); 
     callbackChannel.OnCallback(); 
     DoJob2(); 

    } 
} 

-3- 클라이언트 :

  • 콜백 구현 :

공개 대리자 void ClientNotifiedEventHandler (Object sender, ClientNotifiedEventArgs e);

public class ClientNotifiedEventArgs : EventArgs 
    { 
       private readonly string _message; 
       public string Message { get { return _message; } } 

       public ClientNotifiedEventArgs(string message) 
       { 
        this._message = message; 
       } 
    } 



    [CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, UseSynchronizationContext = false)] 
     public class MyCallbackClient : IMyContractCallback 
     { 
public event ClientNotifiedEventHandler ClientNotified; 
      public void OnCallback() 
      { 
       if (ClientNotified != null) 
         { 
          ClientNotified(this, new ClientNotifiedEventArgs(log)); 
         } 
      } 
     } 
  1. 뷰 모델 구현 :

    Public 클래스 MyViewModel {

    private string _message = "Loading.."; 
    
        public string MessageLog 
    
        { 
         get { return _message; } 
         set 
         { 
          _message = value; 
          NotifyOfPropertyChange(() => MessageLog); 
         } 
        } 
    
        public void DoTheJob() 
        { 
         var callback = new DbLoaderCallback(); 
         callback.ClientNotified += Callback_ClientNotified; 
         var context = new InstanceContext(callback); 
         using (var serviceClient = new MyService(context)) 
         { 
          serviceClient.DoSomething(); 
         } 
        } 
    
        private void Callback_ClientNotified(object sender, ClientNotifiedEventArgs e) 
        { 
         MessageLog += " \n"; 
         MessageLog += e.Message; 
    
        }  
    

    } 실행이) (callbackChannel.OnCallback에 와서 여기

; (MyService에서), NotifyOfPropertyChange (() => MessageLog)에 오면 MyViewModel의 클라이언트로 간다. 실행을 계속하지 않습니다. 따라서 DoJob2()는 실행되지 않았습니다.

정확히 어떤 것이 문제인지 확인 했습니까? 미리 감사드립니다.

답변

0

귀하는 콜백에 대해 UseSynchronizationContext = false을 지정 했으므로 모든 콜백이 스레드 풀에서 호출됩니다. UI는 모든 스레드에서 자체를 업데이트 할 수 있지만 디스패처 하나에서 업데이트 할 수 없습니다. 따라서 MessageLog 속성의 업데이트를 디스패처 스레드에 마샬링해야합니다. this answer을 참조하십시오.