【问题标题】:Windows Service restarts on ExceptionWindows 服务在异常时重新启动
【发布时间】:2009-05-21 14:40:13
【问题描述】:

我正在构建一个定期从网站获取信息的 Windows 服务 捕获到异常时如何重新开始查找?例如,当互联网随后出现中断和上升时。

代码:

public string cadena(string pagina)
        {
            try
            {
                String cadena;
                WebRequest myWebRequest = WebRequest.Create(pagina);
                myWebrequest = 10000;
                WebResponse myWebResponse = myWebRequest.GetResponse();
                Stream ReceiveStream = myWebResponse.GetResponseStream();
                Encoding encode = System.Text.Encoding.GetEncoding("ISO-8859-1");
                StreamReader readStream = new StreamReader(ReceiveStream, encode);
                cadena = readStream.ReadToEnd();
                readStream.Close();
                myWebResponse.Close();
                return cadena;
            }
            catch (WebException error)
            {
                myTimer.Enabled = true;
                return "error";
            }
        }
public void inicia(object sender, System.Timers.ElapsedEventArgs e)
        {
                myTimer.Enabled = false;
                String strSite = cadena("www.something.com");
                //Do something with strSite...
                myTimer.Enabled = true;            
        }
    protected override void OnStart(string[] args)
            {           
                    myTimer = new System.Timers.Timer();                    
                    myTimer.Interval = 1500;         
                    myTimer.Elapsed += new System.Timers.ElapsedEventHandler(inicia);      
                    myTimer.Enabled = true;            
            }

【问题讨论】:

  • 为什么不直接增加 catch 块中的计时器并在 try 中将其设置为 1500?在下一次成功的尝试中,它将有 1500 的间隔。我认为您需要捕获的不仅仅是 WebException,TimeoutException 是一个大问题。
  • 如何在 catch 中添加另一个异常?
  • @unknown:您只需将它们链接起来:尝试 {} catch (WebException we){} catch (TimeoutException te){} 等等。
  • 只需在第一个 catch 块下方添加另一个 catch 块。

标签: c# asp.net windows-services timeout system.net.webexception


【解决方案1】:

这是一个非常粗略的示例,可以帮助您入门,这将使您的程序无法继续,直到您得到有效的响应。有更好的方法可以做到这一点,但这是您想要的想法。祝你好运!

myWebResponse = myWebRequest.GetResponse();
while (myWebResponse.ContentLength == -1) {  
  //sleep
 myWebResponse = myWebRequest.GetResponse();
}  

//continue execution

您可能应该检查远程站点是否可用,然后轮询直到可用,或者在服务可用时中断。这样您就不必从抛出的异常中恢复。

我认为应该为对您的应用程序造成更大灾难性的事情保留使用异常。

【讨论】:

  • 感谢您的回复。我已经尝试过了,但是在投票过程中,如果互联网中断,仍然会挂在那里并抛出异常。
  • Hrm,我敢打赌,这与您在轮询时尝试的命令有关,您可以发布该代码以便我们看一下吗?
  • 那么函数 cadena 只返回带有数据的字符串,我从字符串中获取我需要的信息,所以轮询在于将值分配给字符串。
  • 当你检查 cadena() 是否返回一个字符串时,已经太晚了,你的异常已经被抛出。在开始尝试从远程站点读取数据之前,您需要轮询有效的连接。
  • 有道理,在这种情况下验证连接的最佳方法是什么?
最近更新 更多