【问题标题】:How to efficiently check an availability of a web service in c#?如何在 C# 中有效地检查 Web 服务的可用性?
【发布时间】:2013-11-07 15:51:36
【问题描述】:

我有一个 c# winform 桌面应用程序。它正在通过调用我的 [web 方法] 检查我的服务器上的消息。

由于我正在开发中,这个 [web 方法] 并不总是可供我的测试客户端使用。

尽管如此,客户端仍在调用此 [Web 方法]。

我注意到在这种情况下(在我的 PC 版本上)CPU 使用率达到 25%。

目前,我的 [web 方法] 在我的客户端上以 while(true) 循环调用。随后,[web方法]被递归调用。

这个while循环已经被一个新线程启动了。

我有一个 c# winform 桌面应用程序。它正在通过调用我的 [web 方法] 检查我的服务器上的消息。

由于我正在开发中,这个 [web 方法] 并不总是可供我的测试客户端使用。

尽管如此,客户端仍在调用此 [Web 方法]。

我注意到在这种情况下(在我的 PC 版本上)CPU 使用率达到 25%。

目前,我的 [web 方法] 在 While(true) 循环中在我的客户端上被调用。随后,[web方法]被递归调用。

这个while循环已经被一个新线程启动了。

Thread _th = new Thread(MyLoop);
_th.Start();


void MyLoop()
{
  while (true)
  {
    if (Disconnect)
    {
      return;
    }
    string[] _requests = Shared.WSconnector.GetRequests(Shared.ActiveMac);
    //do something with these server requests...
  }
}

虽然我的 Web 服务中断的可能性很小,但它显然仍然会发生。

我如何保护我的客户免受这种 CPU 增加的影响?

谢谢

虽然我的 Web 服务中断的可能性很小,但它显然仍然会发生。

我如何保护我的客户免受这种 CPU 增加的影响?

【问题讨论】:

  • 您能否展示一些有关如何调用此 [web 方法] 的代码。
  • 您多久检查一次?如果其他机器可以访问,我们有类似的地方进行测试。您还可以在 while 循环中添加睡眠,这样它就不会撞击不可用的系统...
  • @Jite 嗨,已添加代码..
  • @Offler 您好,感谢您的反馈。我曾考虑过放入一个 thread.sleep(1000) 但只是想先在这里检查一下。对我来说,问题是通信需要尽可能实时。

标签: c# web-services


【解决方案1】:

不要在while(...) 循环中调用网络客户端,而是使用System.Timers.Timer

调用本身使异步:How to use HttpWebRequest (.NET) asynchronously,因此所有这一切都不会涉及任何 CPU 密集型操作。

这自然会导致对代码进行轻微的重新架构,但这是一条可行的路。

【讨论】:

  • 嗨,我也考虑过这样做。所以你认为我应该删除线程。将“网络调用程序”代码放在计时器中,然后在计时器中使用异步调用?非常感谢
  • @AndrewSimpson:是的,我会安排计时器,之后我从服务中得到任何类型的响应。因此,在为下一个调度程序 Web 服务查询启动计时器之后,首先获得响应(成功或失败)。通过这种方式,我将避免仍在运行的计时器重叠响应,并开始另一个响应。
  • 酷,所以在 timer_tick 事件中做:this.timer.enabled = false; '调用我的 [web 方法]'; this.timer.enabled = true;?谢谢..
  • @AndrewSimpson:正确。仅在响应时运行计时器,即。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 2019-01-18
相关资源
最近更新 更多