[英]How to close Client Proxy with Async Call WCF
我有一個WCF客戶端代理,可用來調用如下異步方法:
var prox = new DoSomethingServiceClient("BasicHttpBinding_IDoSomethingService");
prox.DoSomethingCompleted += new EventHandler<AsyncCompletedEventArgs>(svcref_DoSomethingCompleted);
prox.DoSomethingAsync(0, Guid.NewGuid());
我什么時候關閉/中止代理?
我svcref_DoSomethingCompleted
使用發件人對象在svcref_DoSomethingCompleted
中的第一行中svcref_DoSomethingCompleted
操作?
我在MS文檔中看到它們關閉了主線程中的代理,而不是回調中的代理。 那是好習慣嗎? 我覺得不對:
http://msdn.microsoft.com/en-us/library/ms730059(v=vs.110).aspx
我還發現了這一點,它使用基於任務的異步方式,建議您在委托回調中關閉代理,這是我所期望的:
http://fun-with-blackhawk.blogspot.com/2010/03/wcf-exception-handling-in-asynchronous.html
這就是WCF變得棘手的地方。 當服務器調用回調方法時,它需要在關閉客戶端代理之前完成該調用。 這意味着要往返於客戶和客戶之間。 Microsoft示例向客戶端(通過Console.ReadLine())請求用戶輸入以觸發關閉。 如果要使用異步回調觸發關閉,則需要發揮創意。 例如,您可以將關閉隊列放在新線程上,然后延遲執行。 這將允許回調完成返回服務器的行程,然后關閉通道。
在回調中添加以下內容:
var currentChannel = OperationContext.Current.Channel;
ThreadPool.QueueUserWorkItem(o => CloseChannel(currentChannel));
然后針對CloseChannel:
private static void CloseChannel<T>(T channel)
{
var clientChannel = (IClientChannel)channel;
var success = false;
try
{
//sleep before close so the main thread has a chance to catch up
Thread.Sleep(10000);
clientChannel.Close();
success = true;
}
catch (CommunicationException ce)
{
clientChannel.Abort();
}
catch (TimeoutException te)
{
clientChannel.Abort();
}
finally
{
if (!success)
clientChannel.Abort();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.