2013-08-23 2 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-encode 's'. – SLaks

+0

s - просто номер. Поэтому нет необходимости в кодировке URL, но спасибо. –

+0

В чем проблема? – SLaks

ответ

1

Вы должны позвонить req.GetResponseAsync(), чтобы отправить запрос.

0

Чтобы добавить @SLaks

У нас была та же проблема, и это оказалось проблемой в другом месте, чем можно было первоначально догадываться.

Вы должны .Dispose() или, по крайней мере, .close(), то ответ, что вы получите от .GetResponseAsync, в противном случае следующий вызов .GetRequestStreamAsync зависает.

Похоже, что в этом коде есть ограниченное (довольно малое) количество сокетов или замков, которые не разрешают дальнейшие запросы даже начинаться до завершения предыдущего запроса.

Смежные вопросы