首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Task<WebResponse>.Wait永远存在

Task<WebResponse>.Wait永远存在
EN

Stack Overflow用户
提问于 2012-09-21 14:41:59
回答 1查看 956关注 0票数 3

C#,.Net 4.5.我有一个包含要处理的对象的队列。处理包括利用在对象的字段之一中指定的URL获取数据。在操作过程中,可以将新对象添加到队列中。当我尝试使用网络异步工作时,我遇到了一个问题。

这是一个最小的代码。

代码语言:javascript
复制
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位)上,一切运行正常。这对我来说似乎很奇怪。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-08 19:41:57

在进行这样的修改后,此代码已停止挂起:

代码语言:javascript
复制
...
Debug.Print("Url: {0}, bytes: {1}", o.Url, 
    o.RespTask.Result.ContentLength);

o.RespTask.Result.Close();

i++;
...

我的错误是没有注意到对HttpWebResponse类的Close方法的调用是必须的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12525460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档