簡體   English   中英

如何使用異步調用WCF關閉客戶端代理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM