詳細介紹WCF回調(diào)返回值說明
客戶端實現(xiàn)WCF回調(diào)時,如果回調(diào)函數(shù)有返回值,那么該返回值類型只能為基本類型,不能為接口類型,否則服務在回調(diào)時系統(tǒng)無響應,***超時,不報任何錯誤。所以大家有communitysever的可以從里面獲得然后反編譯為自己所用,沒有的就到網(wǎng)絡上搜下吧,有許多資源呢!
由于WCF回調(diào)方法并非運行在主線程中,如果WCF回調(diào)方法需要更新與異步調(diào)用結(jié)果相關(guān)的界面,例如本例中的lbMessage控件,則需要將回調(diào)的調(diào)用封送(Marshal)到當前主程序界面的同步上下文中。我們可以使用 SynchronizationContext以及它的SendOrPostCallback委托,對調(diào)用進行封送:#t#
利用異步方式執(zhí)行服務操作,使得服務在執(zhí)行過程中不會阻塞主線程,當方法執(zhí)行完成后,通過AsyncCallback回調(diào)對應的方法,可以通知客戶端服務執(zhí)行完畢。例如:
- //Invoke it Asynchronously
- m_service.BeginTransferDocument(m_doc,OnTransferCompleted,null);
- //Do some work;
- //callback method
- void OnTransferCompleted(IAsyncResult result)
- {
- Stream stream = m_service.EndTransferDocument(result);
- result.AsyncWaitHandle.Close();
- lbMessage.Text = string.Format("The file {0} had been transfered sucessfully.",
- m_doc.FileName);
- }
在調(diào)用BeginTransferDocument()方法之后,主線程不會被阻塞,仍然可以繼續(xù)執(zhí)行其它工作。而當服務方法執(zhí)行完畢之后,會自動調(diào)用WCF回調(diào)方法,執(zhí)行方法中的內(nèi)容。上述實現(xiàn)存在一個問題,就是對于lbMessage控件的操作。由于WCF回調(diào)方法并非運行在主線程中,如果回調(diào)方法需要更新與異步調(diào)用結(jié)果相關(guān)的界面,例如本例中的lbMessage控件,則需要將回調(diào)的調(diào)用封送(Marshal)到當前主程序界面的同步上下文中。我們可以使用 SynchronizationContext以及它的SendOrPostCallback委托,對調(diào)用進行封送:
- public ExplorerClientForm() { InitializeComponent(); m_synchronizationContext = SynchronizationContext.Current; }
- private SynchronizationContext m_synchronizationContext; }