老鳥談WCF回調(diào)使用方法
經(jīng)過長時間學(xué)習(xí)WCF,于是和大家分享一下,看完本文你肯定有不少收獲,希望本文能教會你更多東西。由于WCF回調(diào)方法并非運行在主線程中,如果WCF回調(diào)方法需要更新與異步調(diào)用結(jié)果相關(guān)的界面,例如本例中的lbMessage控件,則需要將回調(diào)的調(diào)用封送(Marshal)到當(dāng)前主程序界面的同步上下文中。我們可以使用 SynchronizationContext以及它的SendOrPostCallback委托,對調(diào)用進行封送:
- public ExplorerClientForm()
- {
- InitializeComponent();
- m_synchronizationContext = SynchronizationContext.Current;
- }
- private SynchronizationContext m_synchronizationContext;
則WCF回調(diào)方法修改為:
- //callback method
- void OnTransferCompleted(IAsyncResult result)
- {
- Stream stream = m_service.EndTransferDocument(result);
- result.AsyncWaitHandle.Close();
- SendOrPostCallback callback = delegate
- {
- lbMessage.Text = string.Format("The file {0} had been transfered sucessfully.",
- m_doc.FileName);
- };
- m_synchronizationContext.Send(callback,null);
- }
#T#在調(diào)用異步方法時,由于對BeginTransferDocument()和EndTransferDocument()方法的調(diào)用可能會在不同的方法體中,因而我將服務(wù)代理對象定義為private字段。如果希望將服務(wù)對象定義為一個局部變量,可以在調(diào)用BeginTransferDocument() 方法時,將代理對象傳遞到方法的asyncState參數(shù)中,然后在調(diào)用EndTransferDocument()方法之前,通過 IAsyncResult獲得準(zhǔn)確的服務(wù)代理對象:
- m_service.BeginTransferDocument(m_doc,OnTransferCompleted,m_service);
將m_service作為asyncState對象傳入之后,在調(diào)用EndTransferDocument()方法之前,就可以根據(jù)它先獲得服務(wù)代理對象:
- IDocumentsExplorerService m_service = result.AsyncState as IDocumentsExplorerService;
- Stream stream = m_service.EndTransferDocument(result);
- //rest codes