2

URL 要求を送信して応答を非同期に取得しようとしていますが、.fromAsync メソッドを .ContinueWith メソッドと共に使用すると、タスクのステータスが WaitingForActivation から Running に変わりません。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タスクを自動的にスケジュールします。ドキュメントから:

FromAsync が実行されているスレッドで beginMethod デリゲートが開始されます。このメソッドは、beginMethod によってスローされたすべての例外をスローします。

通常、ラムダなしでこれを記述します。

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 に答える