如上所述elsewhere,此代码有可能出现竞争条件:
// do stuff with client, catch exceptions
if (client.State == CommunicationState.Faulted)
{
client.Abort();
}
else
{
// I hope nothing happened since I checked for a faulted state
client.Close();
}
......还是吗?
作为状态机,在什么情况下客户会在中间检查其状态并随后关闭状态时进入故障状态?即使在几分钟/小时/天之后。
我尝试了以下简单的测试,以排除与服务器的连接丢失:
作为第二个测试,我等待ReceiveTimeout
过去,而不是杀死服务器进程。然后我等了一分钟。然后我踏上了Client.Close()。没问题。
客户是否可以在没有任何输入的情况下进入故障状态,如果没有,是否真的存在竞争条件?
using
但他们可以使用try-catch-finally
,只要最终检查故障状态并中止而不是比关闭(我认为这种方法易于理解和采用 - 很重要,因为在启动WCF时已经有很多东西需要学习)。
然后我开始考虑竞争条件问题,并且想不到一个可能发生的例子,假设意图是关闭客户端,如果它是你不会做的在别处使用(即在当前程序中的程序或线程之间共享。)
所以,问题仍然存在,在这种情况下是否存在竞争条件的可能性,是否有人可以向我展示一些演示它的代码?
答案 0 :(得分:0)
您链接的帖子是关于wxf代理客户端的using语句问题的相当通用的解决方案。因此,在广义条件下,有很多情况我可以想象你粘贴的代码竞争。特别是共享同一客户端的多线程情况。
答案 1 :(得分:0)
没有令人满意的答案,所以the MSDN solution必须这样做:
try
{
...
client.Close();
}
catch (CommunicationException e)
{
...
client.Abort();
}
catch (TimeoutException e)
{
...
client.Abort();
}
catch (Exception e)
{
...
client.Abort();
throw;
}