2013-08-23 50 views
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請求的一部分。然後當它完成時,清除列表框。

有人可以解釋什麼是錯的?

+0

您需要對URL進行編碼。 – SLaks

+0

s只是一個數字。所以不需要URL編碼,但是謝謝。 –

+0

究竟是什麼問題? – SLaks

回答

1

你應該叫req.GetResponseAsync()實際發送請求。

0

爲了增加@SLaks

我們有同樣的問題,它原來是在不同的地方比人們原先估計的問題。

你需要.Dispose()或至少.Close()的響應你從.GetResponseAsync得到,否則.GetRequestStreamAsync下一個電話掛斷。

看來,這背後的代碼保存插座或鎖的一些有限的(相當低)量,即禁止進一步的請求,甚至開始,直到前一個請求已完成。