如其他地方所述,此代码可能会出现竞争条件:
// 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();
}
……或者是吗?
作为状态机,在什么情况下客户端会在尝试检查其状态并随后关闭它之间进入故障状态?即使在几分钟/几小时/几天之后。
我尝试了以下简单的测试,以排除丢失与服务器的连接:
- 在 if 语句处设置一个断点。我看到 client.State == 打开了。踩上去。
- 终止 WCF 服务器进程。踩上去。
- Client.Close() 执行没有问题。
作为第二个测试,我没有杀死服务器进程,而是等待ReceiveTimeout
过去。然后我又等了一分钟。然后我踩到 Client.Close()。没问题。
如果没有我的任何输入,客户端是否可以进入故障状态,如果不能,是否真的有可能出现竞争条件?
编辑:也许这太笼统了,但我正在寻找一般指导。我问这个问题的原因是因为我需要让一些 Web 开发人员使用 WCF 而不是过时的 Web 服务技术。理想情况下,我希望能够告诉他们他们不能使用using
,但try-catch-finally
只要最终检查错误状态并中止而不是关闭,他们就可以使用(我认为这种方法很容易理解和采用 - 很重要,鉴于当你开始 WCF 时,已经有很多东西要学了)。
然后我开始考虑竞争条件问题并且想不出一个可能发生的例子,因为目的是关闭客户端,如果它在其他地方使用你不会这样做(即在程序之间共享或当前程序中的线程。)
所以,问题仍然存在,在这种情况下是否存在竞争条件,任何人都可以向我展示一些演示它的代码吗?