1

其他地方所述,此代码可能会出现竞争条件:

    // 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 时,已经有很多东西要学了)。

然后我开始考虑竞争条件问题并且想不出一个可能发生的例子,因为目的是关闭客户端,如果它在其他地方使用你不会这样做(即在程序之间共享或当前程序中的线程。)

所以,问题仍然存在,在这种情况下是否存在竞争条件,任何人都可以向我展示一些演示它的代码吗?

4

2 回答 2

0

您链接的帖子正在讨论针对 wxf 代理客户端的 using 语句问题的相当通用的解决方案。因此,在一般情况下,我可以想象在很多情况下您粘贴的代码会发生竞争。尤其是共享同一个客户端的多线程情况。

于 2012-04-13T22:35:24.950 回答
0

没有令人满意的答案,所以MSDN 解决方案将不得不这样做:

try
{
    ...
    client.Close();
}
catch (CommunicationException e)
{
    ...
    client.Abort();
}
catch (TimeoutException e)
{
    ...
    client.Abort();
}
catch (Exception e)
{
    ...
    client.Abort();
    throw;
}
于 2012-05-11T17:26:51.563 回答