我使用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)
。
我想检测到这个问题并重新连接。 我想过以某种方式设置超时以防止程序挂起。怎么办呢?
答案 0 :(得分:1)
这里有两个可能的答案:
在Stacky的UrlClient.cs中有一个对HttpWebRequest.GetResponse的阻塞调用,并且在响应流上有一个对ReadToEnd的阻塞调用。没有为任何一个调用设置超时,也没有为HttpWebRequest对象本身设置超时:
另外,我没有在connectionManagement设置中看到任何允许在响应上设置超时并从HttpWebRequest的响应流中读取的内容:
Stack UrlClient代码重新抛出404和407以外的WebExceptions(需要代理身份验证),所以如果你从StackOverflow得到一个408(服务器计时你出去)它会抛出Stacky GetQuestions调用,这是为什么我怀疑你可能会看到一个未被捕获的异常,而不是一个悬念。
我只是在Chrome浏览器中浏览问题时会定期看到来自StackOverflow的408,因此您的程序可能会发生这种情况,您只需要捕获异常并在延迟后重试。
希望这会有所帮助 - 哈罗德