각 작업이 실행 된 후 클라이언트에 메시지를 보내는 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));
}
}
}
뷰 모델 구현 :
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()는 실행되지 않았습니다.
정확히 어떤 것이 문제인지 확인 했습니까? 미리 감사드립니다.