没有触发事件,WCF客户端是否会出现故障?

时间:2012-04-13 22:12:40

标签: c# wcf

如上所述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 == open。继续。
  • 终止WCF服务器进程。继续。
  • Client.Close()执行没有问题。

作为第二个测试,我等待ReceiveTimeout过去,而不是杀死服务器进程。然后我等了一分钟。然后我踏上了Client.Close()。没问题。

客户是否可以在没有任何输入的情况下进入故障状态,如果没有,是否真的存在竞争条件?


编辑:也许这太笼统了,但我一直在寻找一般指导。我问这个问题的原因是因为我需要让一些Web开发人员使用WCF而不是过时的Web服务技术。理想情况下,我喜欢能够告诉他们他们不能使用using但他们可以使用try-catch-finally,只要最终检查故障状态并中止而不是比关闭(我认为这种方法易于理解和采用 - 很重要,因为在启动WCF时已经有很多东西需要学习)。

然后我开始考虑竞争条件问题,并且想不到一个可能发生的例子,假设意图是关闭客户端,如果它是你不会做的在别处使用(即在当前程序中的程序或线程之间共享。)

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

2 个答案:

答案 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;
}