gpt4 book ai didi

WCF - 如何在开始和结束调用之间保留 channel /代理

转载 作者:行者123 更新时间:2023-12-02 12:13:50 26 4
gpt4 key购买 nike

我正在尝试使用 ChannelFactory 来调用异步服务。

我不确定的是如何最好地保留对 channel 的引用 - 在调用 BeginSave 和 EndSave(在回调方法中)之间。

我目前正在通过将其分配给实例变量来实现此目的,但这似乎并不理想。我只希望该 channel 在调用的生命周期内存在(我认为这是最佳实践,即打开、使用它、关闭它)。我还想确保关闭正确的 channel ,在某些情况下可能存在多个 channel 。

任何有关如何最好地做到这一点的示例都会很棒。

这是我的代码:

public partial class MyForm : Form
{

ICompanyService m_Channel;

public MyForm()
{
InitializeComponent();

// ChannelProvider is a class I've created which returns a channel created by the ChannelFactory
ChannelProvider<ICompanyService> channelProvider = new ChannelProvider<ICompanyService>();
m_Channel = channelProvider.GetChannel();
}

private void OnSaveButtonClickAsync(object sender, EventArgs e)
{
Company company = new Company();
company.BranchId = "A1";
company.CompanyName = "A1 LTD";

m_Channel.BeginSave(
company,
new AsyncCallback(OnSaveCallback),
null);

StatusLabel.Text = "Saving...";
}

private void OnSaveCallback(IAsyncResult ar)
{
int result = m_Channel.EndSave(ar);

Invoke(
new MethodInvoker(delegate()
{
StatusLabel.Text = result.ToString();
}));
}
}

非常感谢。

最佳答案


很抱歉延迟回复您此事。我认为您遇到的问题之一是您没有正确实例化代理。不确定您的 channel 提供商做什么,但创建您自己的 channel 非常简单,可能不需要包装器。

我使用旧的计算器服务示例尝试了一个简单的测试,发现保持 channel 开放没有任何困难。

首先我创建了两个字段...

    private ChannelFactory<ICalculator> m_Factory;
private ICalculator m_Proxy;

然后使用配置文件中的客户端配置在构造函数中实例化工厂。

    m_Factory = new ChannelFactory<ICalculator>("calc");

然后,在调用服务时,我创建代理并执行异步方法。返回调用后,我将代理转换为 ICommunicationObject,它为我提供 channel 的状态。您应该看到您调用的代理仍然打开。然后您应该能够关闭它。

    void OnBegin(object sender, EventArgs e)
{
m_Proxy = m_Factory.CreateChannel();
m_Proxy.BeginAdd(2, 3, OnCompletion, null);

// Do other stuff...
}

void OnCompletion(IAsyncResult result)
{
int sum = m_Proxy.EndAdd(result);
result.AsyncWaitHandle.Close();

ICommunicationObject channel = (ICommunicationObject)m_Proxy;
if (channel.State == CommunicationState.Opened)
channel.Close();
}

希望这有帮助。

关于WCF - 如何在开始和结束调用之间保留 channel /代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5471594/

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