2016-08-05 68 views
1

試圖圍繞我的腦袋爲什麼執行回調的窗體不起作用。SynchronizationContext上的回調

我想要做的事:

  • 按下一個按鈕和一個服務被調用。
  • 服務回調的形式(函數具有IsOneWay =真)
  • 形式更新GUI相應

有UseSynchronizationContext虛假和GUI上的成員調用調用工作正常:

[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; }); 
      } 
     } 
} 

但UseSynchronizationContext =真實和直接調用成員不會:

[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; 
      } 
     } 

無論使用SyynchronizationContext沒有字面上

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

如果第二和第三個版本還工作嗎?該回調稱爲OneWay,因此服務在回調後繼續。

回答

1

是您Form類真的 WCF服務客戶端回調的實現,爲WCF知道它(即不只是你從WCF客戶委託)?如果沒有,那麼你已經把[CallbackBehavior]屬性放在了錯誤的地方。由於文檔指出:

的CallbackBehaviorAttribute必須應用到實現合同

回調類,如果它是你的客戶端回調的執行,那麼沒有一個好的Minimal, Complete, and Verifiable code example我怕我將無法說出爲什麼該屬性沒有預期的效果。但我能夠說,如果確實如此,您的代碼設計不佳。將你的用戶界面和你的服務客戶端回調實現相結合違反了許多健康代碼的OOP原則,但最重要的是Separation of Concerns原則。

至於這個雲:

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

這不是你應該如何使用SynchronizationContextCurrent屬性返回當前正在運行的線程的上下文。當您需要撥打Send()時,檢索上下文爲時已晚。您需要在創建對象時在您希望執行Send()調用的代理的線程中存儲SynchronizationContext.Current(當然,該線程必須具有有用的上下文,例如在Winforms程序的主UI線程中找到的上下文)。

如果上述內容不能爲您的代碼提供足夠的信息,請通過提供可靠地再現問題的良好MCVE來改善問題。

+0

callbackbehavior放置正確是,表單實現了回調。我將嘗試存儲SynContext現在 – Laurijssen

+0

的確,在InitializeComponent工作後存儲SynContext – Laurijssen

+0

我不同意實際上關注的問題。一個實現回調的表單,其唯一目的是更新表單對我來說看起來不錯 – Laurijssen

相關問題