这为什么挂?

时间:2013-08-23 02:03:00

标签: c#

private async void button1_Click(object sender, EventArgs e)
    {
        var cookie = webBrowser1.Document.Cookie;
        await
            Task.WhenAll(
                listBox1
                .Items
                .Cast<string>()
                .Select(async s =>
                {
                    var data = "action=relationship&user_id=" + s + "&relation=follow";
                    var req = WebRequest.Create("http://example.com") as HttpWebRequest;
                    req.Method = "POST";
                    req.ContentType = "application/x-www-form-urlencoded";
                    req.ContentLength = data.Length;
                    req.Headers["cookie"] = cookie;
                    using (var sw = new StreamWriter(await req.GetRequestStreamAsync(), Encoding.ASCII))
                    {
                        sw.Write(data);
                        sw.Close();
                    }
                }));
        listBox1.Items.Clear();
    }

我已经尝试了一百万次,并且每次都运行两次。当它运行它两次时,它会按照预期的那样运行。

它应该做的是从列表框中获取项目,并将每个项目用作POST请求的一部分。然后,当它完成后,它会清除列表框。

有人可以解释什么是错的吗?

2 个答案:

答案 0 :(得分:1)

您应该致电req.GetResponseAsync()以实际发送请求。

答案 1 :(得分:0)

添加到@SLaks

我们遇到了同样的问题,结果证明这是一个问题,而不是原本猜测的问题。

您需要.Dispose()或至少.Close()您从.GetResponseAsync获得的响应,否则下一次调用.GetRequestStreamAsync会挂起。< / p>

这背后的代码似乎拥有一些有限(相当低)的套接字或锁定数量,在前一个请求完成之前不允许进一步的请求甚至开始。