5
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 请求的一部分。然后当它完成时,它会清除列表框。

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

4

2 回答 2

1

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

于 2013-08-23T02:09:04.360 回答
0

添加到@SLaks

我们遇到了同样的问题,但事实证明这是一个与最初猜测不同的问题。

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

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

于 2017-03-23T18:48:32.533 回答