新聞中心
經(jīng)過(guò)長(zhǎng)時(shí)間學(xué)習(xí)WCF,于是和大家分享一下,看完本文你肯定有不少收獲,希望本文能教會(huì)你更多東西。由于WCF回調(diào)方法并非運(yùn)行在主線程中,如果WCF回調(diào)方法需要更新與異步調(diào)用結(jié)果相關(guān)的界面,例如本例中的lbMessage控件,則需要將回調(diào)的調(diào)用封送(Marshal)到當(dāng)前主程序界面的同步上下文中。我們可以使用 SynchronizationContext以及它的SendOrPostCallback委托,對(duì)調(diào)用進(jìn)行封送:

10多年專業(yè)網(wǎng)絡(luò)公司歷程,堅(jiān)持以創(chuàng)新為先導(dǎo)的網(wǎng)站服務(wù),服務(wù)超過(guò)1000+企業(yè)及個(gè)人,涉及網(wǎng)站設(shè)計(jì)、重慶APP軟件開(kāi)發(fā)、微信開(kāi)發(fā)、平面設(shè)計(jì)、互聯(lián)網(wǎng)整合營(yíng)銷等多個(gè)領(lǐng)域。在不同行業(yè)和領(lǐng)域給人們的工作和生活帶來(lái)美好變化。
- 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)用異步方法時(shí),由于對(duì)BeginTransferDocument()和EndTransferDocument()方法的調(diào)用可能會(huì)在不同的方法體中,因而我將服務(wù)代理對(duì)象定義為private字段。如果希望將服務(wù)對(duì)象定義為一個(gè)局部變量,可以在調(diào)用BeginTransferDocument() 方法時(shí),將代理對(duì)象傳遞到方法的asyncState參數(shù)中,然后在調(diào)用EndTransferDocument()方法之前,通過(guò) IAsyncResult獲得準(zhǔn)確的服務(wù)代理對(duì)象:
- m_service.BeginTransferDocument(m_doc,OnTransferCompleted,m_service);
將m_service作為asyncState對(duì)象傳入之后,在調(diào)用EndTransferDocument()方法之前,就可以根據(jù)它先獲得服務(wù)代理對(duì)象:
- IDocumentsExplorerService m_service = result.AsyncState as IDocumentsExplorerService;
- Stream stream = m_service.EndTransferDocument(result);
- //rest codes
本文標(biāo)題:老鳥(niǎo)談WCF回調(diào)使用方法
瀏覽路徑:http://m.fisionsoft.com.cn/article/cccpjoo.html


咨詢
建站咨詢
