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