0

いくつかのデータを取得して文字列として返すクラスがあります。このオブジェクトが機能している間、ユーザーに作業が行われていることを知らせる回転するアイコンがあります。問題は、応答が返される前にコードが終了することです。私は立ち往生しました

while(response == null)

何が起こっているのかを見るためだけに

response = (HttpWebResponse)request.EndGetResponse(AsyncResult);

発砲していません。コンソールアプリケーションで問題なく起動するので、これを、Silverlightが気に入らないことを実行していることに置きます。ここに、完全なコードを示します。

public class HttpWorker
{
    private HttpWebRequest request;
    private HttpWebResponse response;
    private string responseAsString;
    private string url;

    public HttpWorker()
    {

    }

    public string ReadFromUrl(string Url)
    {
        url = Url;
        request = (HttpWebRequest)WebRequest.Create(url);

        request.CookieContainer = new CookieContainer();
        request.AllowAutoRedirect = true;
        request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6";

        AsyncRequest(); // The Demon!

        return responseAsString;
    }

    private void AsyncRequest()
    {
        request.BeginGetResponse(new AsyncCallback(FinaliseAsyncRequest), null);
    }

    private void FinaliseAsyncRequest(IAsyncResult AsyncResult)
    {
        response = (HttpWebResponse)request.EndGetResponse(AsyncResult);


        if (response.StatusCode == HttpStatusCode.OK)
        {
            // Create the stream, encoder and reader.
            Stream responseStream = response.GetResponseStream();
            Encoding streamEncoder = Encoding.UTF8;
            StreamReader responseReader = new StreamReader(responseStream, streamEncoder);
            responseAsString = responseReader.ReadToEnd();
        }
        else
        {
            throw new Exception(String.Format("Response Not Valid {0}", response.StatusCode));
        }
    }

}
4

3 に答える 3

1

(while response == null)UIスレッドでビジーループに入りますか?の非同期コールバックHttpRequestはUIスレッドで配信されるため、同じスレッドでループしている場合、コールバックを実行することはできません。メインメッセージループを実行できるように戻る必要があります。そうすると、非同期コールバックが配信されます。

上記の設計は、とにかく本当に必要なのは同期フェッチであることを示唆しています。コールバックを忘れて、自分のFinaliseAsyncRequest中で電話してReadFromUrlください。UIはリクエストが完了するまでハングしますが、それはあなたが望んでいることのように聞こえます。

于 2010-11-09T17:22:39.897 に答える
1

ここに、WebClientとHttpWebRequestの使用に関する実用的なサンプルを投稿しました。

WebClient、HttpWebRequest、およびWindowsPhone7のUIスレッド

UIのブロックを回避するために、重要な処理には後者が推奨されることに注意してください。

コードを自由に再利用してください。

于 2010-11-10T00:50:20.197 に答える
0

Webサーバーから文字列を取得する最も簡単な方法は、WebClient.DownloadStringAsync()MSDN docs)を使用することです。

次のようなものを試してください。

private void DownloadString(string address)
{
    WebClient client = new WebClient();
    Uri uri = new Uri(address);

    client.DownloadStringCompleted += DownloadStringCallback;
    client.DownloadStringAsync(uri);

    StartWaitAnimation();
}


private void DownloadStringCallback(object sender, DownloadStringCompletedEventArgs e)
{
    // Do something with e.Result (which is the returned string)

    StopWaitAnimation();
}

コールバックはUIスレッドで実行されるため、このメソッドは、実行中にUIをブロックするため、コールバックメソッドがあまり機能していない場合にのみ使用する必要があることに注意してください。

Webリクエストをさらに制御する必要がある場合は、HttpWebRequestを使用できます。

本当に同期動作を模倣する必要がある場合は、SilverlightWP7での同期呼び出しの偽造をご覧ください。

于 2010-11-09T20:16:21.827 に答える