C#,.Net 4.5。我有一个队列,其中包含要处理的对象。处理包括使用在对象的一个字段中指定的 URL 获取数据。在操作过程中,可以将新对象添加到队列中。当我尝试使用网络异步完成工作时,我遇到了一个问题。
这是最少的代码。
public partial class Form1 : Form
{
private void button1_Click(object sender, EventArgs e)
{
string[] urls = { "http://www.stackoverflow.com/",
"http://www.google.com/",
"http://www.microsoft.com/" };
int i = 0;
Queue<MyClass1> queue = new Queue<MyClass1>();
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(urls[i]);
webRequest.Proxy.Credentials = CredentialCache.DefaultCredentials;
queue.Enqueue(new MyClass1(urls[i], webRequest.GetResponseAsync()));
while (queue.Count > 0)
{
MyClass1 o = queue.Dequeue();
o.RespTask.Wait();
Debug.Print("Url: {0}, bytes: {1}", o.Url,
o.RespTask.Result.ContentLength);
i++;
if (i < urls.Length)
{
webRequest = (HttpWebRequest)WebRequest.Create(urls[i]);
webRequest.Proxy.Credentials = CredentialCache.DefaultCredentials;
queue.Enqueue(new MyClass1(urls[i], webRequest.GetResponseAsync()));
}
}
}
}
public class MyClass1
{
public MyClass1() { }
public MyClass1(string url, Task<WebResponse> respTask)
{
Url = url;
RespTask = respTask;
}
public string Url;
public Task<WebResponse> RespTask;
}
该代码卡在 o.RespTask.Wait();在循环的第三次迭代中。在此调用之前 o.RespTask.Status 具有值 WaitingForActivation 并且等待永远持续。我做错了什么?
更新。我检查了 3 个盒子上的代码。在其中两个(Win7 32 位和 Win7 64 位)上,程序挂起。第三个(Win7 64 位)一切正常。在我看来这很奇怪。
最佳答案
经过这样的修改,此代码已不再挂起:
...
Debug.Print("Url: {0}, bytes: {1}", o.Url,
o.RespTask.Result.ContentLength);
o.RespTask.Result.Close();
i++;
...
我的错误是我没有注意到必须调用 HttpWebResponse 类的 Close 方法这一事实。
关于c# - Task<WebResponse>.Wait 永远持续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12525460/