gpt4 book ai didi

c# - 如何使用异步调用 WCF 关闭客户端代理

转载 作者:太空宇宙 更新时间:2023-11-03 13:28:08 26 4
gpt4 key购买 nike

我有一个 WCF 客户端代理,我用它来调用异步方法,如下所示:

var prox = new DoSomethingServiceClient("BasicHttpBinding_IDoSomethingService");
prox.DoSomethingCompleted += new EventHandler<AsyncCompletedEventArgs>(svcref_DoSomethingCompleted);
prox.DoSomethingAsync(0, Guid.NewGuid());

我什么时候关闭/中止代理?

我是否使用发送者对象在 svcref_DoSomethingCompleted 的第一行中执行此操作?

我在 MS 文档中看到他们在主线程中关闭了代理,而不是在回调中。这是好的做法吗?我觉得不对:

http://msdn.microsoft.com/en-us/library/ms730059(v=vs.110).aspx

我也发现了这一点,使用基于任务的异步建议您在委托(delegate)回调中关闭代理,这正是我所期望的:

http://fun-with-blackhawk.blogspot.com/2010/03/wcf-exception-handling-in-asynchronous.html

最佳答案

这就是 WCF 变得棘手的地方。当服务器调用回调方法时,它需要在客户端代理关闭之前完成该调用。这意味着到客户端的完整往返行程。 Microsoft 示例在客户端请求用户输入(通过 Console.ReadLine())以触发关闭。如果您想使用异步回调来触发关闭,您需要发挥创意。例如,您可以在新线程上对关闭进行排队,然后延迟执行。这将允许回调完成返回服务器的行程,然后关闭 channel 。

在你的回调中添加这样的东西:

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();
}
}

关于c# - 如何使用异步调用 WCF 关闭客户端代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21588549/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com