2010-10-14 2 views
0

Я действительно не понимаю поток/работу методов async. Я создал WebRequest, который отправляет данные на сервер. Он содержит гораздо больше кода, чем если бы я использовал обычные методы.Нужна помощь в понимании методов C# Async (HttpWebRequest)

Я заметил во всех обратных вызовах, я получаю запрос от result.AsyncState. Также скажите только, чтобы написать в поток запросов, мне нужно иметь 1 callback (reqCB) ... Это так запутанно. Интересно, как они относятся к действиям в реальной жизни?

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var req = (HttpWebRequest)WebRequest.Create("http://localhost/php/upload.php"); 
    req.Method = "POST"; 
    req.ContentType = "application/x-www-form-urlencoded"; 

    req.BeginGetRequestStream(new AsyncCallback(ReqCB), req); 
} 

private void ReqCB(IAsyncResult result) 
{ 
    var req = (HttpWebRequest)result.AsyncState; 
    using (var reqStream = req.EndGetRequestStream(result)) { 
     var writer = new StreamWriter(reqStream); 
     writer.Write("foo=bar&baz=12"); 
     writer.Flush(); 
    } 
    req.BeginGetResponse(new AsyncCallback(ResCB), req); 
} 

private void ResCB(IAsyncResult result) 
{ 
    var req = (HttpWebRequest)result.AsyncState; 

    var res = req.EndGetResponse(result); 
    using (var resStream = res.GetResponseStream()) { 
     var reader = new StreamReader(resStream); 
     resStream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(ReadCB), req); 
     _dispatcher.Invoke(new Action(delegate 
     { 
      txt1.Text = res.ContentLength.ToString(); 
     })); 
    } 
} 

ответ

2

Это может помочь составить список, который вы передали кому-то. Каждый шаг занимает много времени, поэтому они забывают, что следующий шаг, прежде чем они будут сделаны. Таким образом, они достигают своего кармана, вытаскивают список и понимают, что делать дальше.

IAsyncResult имеет общее свойство AsyncState, поэтому его можно использовать многими различными типами механизмов обратного вызова. Вот почему вам нужно привести результат.

+0

Интересно, что запись в поток запроса похожа на загрузку и чтение потока ответов? но дело в том, что я только «очищаю» данные один раз, то есть, когда заканчиваю загрузку/запись значений. и когда я прочитал, у меня уже есть «полный» 'resStream'? –

+0

BeginGetRequestStream() вроде запускает «загрузку» запроса. Вы предоставляете дополнительную информацию при записи в поток запросов. Промывка, которая просто заканчивает запись в поток. Когда вы вызываете BeginGetResponse(), запрос полностью отправляется на сервер, и он ожидает ответа сервера. Сервер обрабатывает любую соответствующую очистку, и вы просто получаете поток, представляющий полный «загруженный» ответ. –

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