我正在尝试使用ChannelFactory来调用异步服务。WCF - 如何保持开始和结束通话之间的通道/代理
我不确定的一点是如何最好地保持对通道的引用 - 在调用BeginSave和EndSave(它在回调方法中)之间。
我目前正在通过将它分配给一个实例变量来做到这一点,但这看起来并不理想。我只希望频道在电话的一生中存在(我认为这是最佳做法,即打开,使用它,关闭它)。我也想确定我正在关闭正确的频道,可能会出现不止一个存在的情况。
任何关于如何最好地做到这一点的例子都会很棒。
这里是我的代码:
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();
}));
}
}
非常感谢。
只是出于好奇,为什么你要守住通道?你想用它来打另一个电话吗?我不明白你在做什么。 – stephenl 2011-03-31 05:57:31
这样我可以调用服务的EndSave方法,然后关闭OnSaveCallback方法中的通道。例如,如果我正在同步调用,则可以在同一个方法中完成所有这些操作,而无需实例/成员变量。 – P2l 2011-03-31 12:37:28