0

我使用StackyClient库来遍历 Stack Overflow 中的最新问题。通常这有效:

StackyClient client = new StackyClient("1.1", "", Sites.MetaStackOverflow, new UrlClient(), new JsonProtocol());
var o = new QuestionOptions();
...
IPagedList<Question> l = null;
while (!stop) {   
   l = client.GetQuestions(o);
   var newQuestions = (from Question q in l                      
                       orderby q.Id descending
                       select q).ToList();
   ...
}

但在某些时候,这似乎失败了。可能是由于网络连接问题或者我不知道是什么。程序挂在client.GetQuestions(o).

我想检测该问题并重新连接。我想过以某种方式设置超时以防止程序挂起。怎么做到呢?

4

1 回答 1

1

这里有两个可能的答案:

  1. 你确定这是挂了?您是否在调试器下运行它并确保它没有抛出未捕获的异常?您是否检查过 ProcessExplorer 和/或 Fiddler 以查看请求和套接字是否仍然打开?在我看来,套接字被关闭或者您遇到异常并且没有被捕获的可能性更大。
  2. 如果确认这挂在 GetQuestions 上,那么对代码的审查表明您必须要求 Stacky 的作者实现此功能,否则您将不得不自己实现它......该功能确实据我所知,今天不存在。

在 Stacky 的 UrlClient.cs 中有一个对 HttpWebRequest.GetResponse 的阻塞调用,并且在响应流上有一个对 ReadToEnd 的阻塞调用。没有为任何一个调用设置超时,也没有在 HttpWebRequest 对象本身上设置:

Stacky/UrlClient.cs

此外,我在 connectionManagement 设置中看不到任何允许设置响应超时并从 HttpWebRequest 的响应流中读取的内容:

连接管理设置

Stack UrlClient 代码重新抛出 404 和 407 以外的 WebExceptions(需要代理身份验证),因此如果您从 StackOverflow 获得 408(服务器超时),它将抛出 Stacky GetQuestions 调用,这就是我怀疑的原因可能是您看到的是未捕获的异常而不是挂起。

当我在 Chrome 中浏览问题时,我会定期从 StackOverflow 看到 408,因此这可能发生在您的程序中,您只需要捕获异常并在延迟后重试即可。

希望这会有所帮助 - 哈罗德

于 2013-10-07T13:46:52.303 回答