2013-08-23 15 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(); 
    } 

Ho provato questo milione di volte e lo esegue due volte ogni volta. E quando lo esegue queste due volte, fa quello che dovrebbe.Perché questo è sospeso?

Quello che si deve fare è prendere gli oggetti da una listbox e usare ogni elemento come parte di una richiesta POST. Quindi, al termine, cancella la casella di riepilogo.

Qualcuno può spiegare cosa c'è che non va?

+0

È necessario codificare URL 's'. – SLaks

+0

s è semplicemente un numero. Quindi non c'è bisogno di codifica URL, ma grazie. –

+0

Qual è esattamente il problema? – SLaks

risposta

1

È necessario chiamare req.GetResponseAsync() per inviare effettivamente la richiesta.

0

Per aggiungere al @SLaks

Abbiamo avuto lo stesso problema e si è rivelato essere un problema in luogo diverso di quanto si possa inizialmente immaginare.

È necessario .Dispose() o almeno .Close() il risposta che si ottiene da .GetResponseAsync, altrimenti la successiva chiamata a .GetRequestStreamAsync blocca.

Sembra che il codice sottostante detenga una quantità limitata (piuttosto bassa) di socket o blocchi, che non consente ulteriori richieste di iniziare fino al completamento della richiesta precedente.