我一直在以这种方式关闭和中止频道:
public async Task<MyDataContract> GetDataFromService()
{
IClientChannel channel = null;
try
{
IMyContract contract = factory.CreateChannel(address);
MyDataContract returnValue = await player.GetMyDataAsync();
channel = (IClientChannel);
return returnValue;
}
catch (CommunicationException)
{
// ex handling code
}
finally
{
if (channel != null)
{
if (channel.State == CommunicationState.Faulted)
{
channel.Abort();
}
else
{
channel.Close();
}
}
}
}
假设只有一个线程使用该通道。在检查状态后,我们如何知道通道不会发生故障?如果发生这种情况,代码会尝试 Close(),而 Close() 将在 finally 块中抛出异常。将不胜感激解释为什么这是安全/不安全的以及更好,更安全的方式的示例。