2

我正在尝试发送 url 请求并异步获取响应,但是当我将 .fromAsync 方法与 .ContinueWith 方法一起使用时,任务状态永远不会从 WaitingForActivation 变为正在运行。我曾尝试使用 task.Start(),但它不能与 ContinueWith 一起使用。我将如何通过将任务状态更改为在我的代码中运行?

public void pageCheck(){
    IAsyncResult asyncResult;
    Uri uri = new Uri(TempURL); //TempUrl is assigned a string beforehand
    HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(uri);
    try{
        Task<WebResponse> task = Task.Factory.FromAsync(
            myReq.BeginGetResponse,
            asyncResult => myReq.EndGetResponse(asyncResult),
            (Object)null);

        task.ContinueWith(t =>
            {
                var responseCode = (HttpWebResponse)t.Result;
                ReadStreamFromResponse(t.Result);
                if(responseCode.StatusCode == HttpStatusCode.OK){
                    //updatestatus
                    reponseCode.Close();
                }
            }
        );
    }
    //catch exceptions
}

private String ReadStreamFromResponse(WebResponse response) {
     StreamReader responseStream = new StreamReader(response.GetResponseStream());
     string str = responseStream.ReadToEnd();
     return str;
 }
4

1 回答 1

0

Task.Factory.FromAsync自动安排任务。从文档中

beginMethod 委托在运行 FromAsync 的线程上启动。此方法抛出由 beginMethod 抛出的任何异常。

您通常会在没有 lambda 的情况下编写此代码:

Task<WebResponse> task = Task<WebResponse>.Factory.FromAsync(
        myReq.BeginGetResponse,
        myReq.EndGetResponse,
        null);

如果您使用的是 .NET 4.5 和 C# 5,您也可以WebRequest.GetResponseAsync直接使用。

于 2013-07-01T16:07:22.113 回答