我正在使用VSTS 2008 + C#+ .Net 3.5来开发控制台应用程序,并将请求发送到另一台服务器(Windows Server 2008上的IIS 7.0)。这是我的代码。我的问题是,在我的代码中,我使用while循环来读取来自服务器的块的块。超时request.Timeout = Timeout * 1000负责(1)与服务器的开放连接超时,或(2)每次读取操作的超时,或(3)while循环使用的总时间?
static void PerformanceWorker()
{
Stream dataStream = null;
HttpWebRequest request = null;
HttpWebResponse response = null;
StreamReader reader = null;
try
{
request = (HttpWebRequest)WebRequest.Create(TargetURL);
request.Timeout = Timeout * 1000;
request.Proxy = null;
response = (HttpWebResponse)request.GetResponse();
dataStream = response.GetResponseStream();
reader = new StreamReader(dataStream);
// 1 M at one time
char[] c = new char[1000 * 10];
while (reader.Read(c, 0, c.Length) > 0)
{
globalCounter++;
}
}
catch (Exception ex)
{
lock (counterLock)
{
globalFailCounter++;
Console.WriteLine("Fail Counter: " + globalFailCounter + "\n" + ex.Message + "\n" + ex.StackTrace);
}
}
finally
{
if (null != reader)
{
reader.Close();
}
if (null != dataStream)
{
dataStream.Close();
}
if (null != response)
{
response.Close();
}
}
}
答案 0 :(得分:3)
答案 1 :(得分:1)
从MSDN开始:
超时是毫秒数 后续的同步请求 使用GetResponse方法等待 为了回应,和 GetRequestStream方法等待一个 流。如果资源不是 在超时期限内返回, 请求抛出WebException Status属性设置为 WebExceptionStatus.Timeout。
我怀疑你是否可以在没有任何低级技巧的情况下轻松设置读取操作的超时。您使用响应对象读取的所有数据都来自网卡缓冲区,该缓冲区以可用网络带宽的速率填充。当缓冲区为空且没有新数据来自发送方端点时,您会在执行读取时在某个时刻点击超时。
P.S。这更像是对@Gary答案的评论,也许有人可以将它移到那里。