需要帮助理解C#异步方法(HttpWebRequest)

时间:2010-10-14 15:17:41

标签: c# httpwebrequest

我真的不了解异步方法的流程/工作原理。我创建了一个WebRequest,它将数据发布到服务器。它包含的代码比我使用普通方法的代码多。

我注意到在所有回调中,我收到result.AsyncState的请求。还要说只是写入请求流,我需要有1个回调(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();
        }));
    }
}

1 个答案:

答案 0 :(得分:2)

考虑一个你交给别人的清单可能会有所帮助。每一步都需要很多时间,所以他们忘记了下一步的工作。所以,他们伸手进入口袋,拿出清单,然后意识到下一步该做什么。

IAsyncResult具有一般的AsyncState属性,因此可以被许多不同类型的回调安排使用。这就是你需要投射结果的原因。