5

Windows Phone 7.1 アプリケーションを開発していて、廃棄処理を実装しようとしています。

法的な理由により、ビュー モデルを保存できません。リモート サーバーからビュー モデル データを読み込むために使用できる、暗号化されたセッション ID のみを保存しています。

再開時に、有効期限が切れている場合はセッション ID を確認する必要があります。ユーザーをアプリのログイン ページに移動し、それでも問題ない場合は、サーバーからビュー モデル データをリロードします。

問題は、HttpWebRequest にブロッキング API がないことです。さらに、廃棄解除後の page.OnNavigatedTo メソッド内では、ここで説明されているメソッドは永久にブロックされます。

独自のスプラッシュ スクリーンを表示することで、この問題を回避しました。

ただし、システム提供の「Resuming…」スプラッシュ スクリーンが表示されている間に、つまり page.OnNavigatedTo メソッドから戻る前に、これらの RPC 呼び出しを完了したいと考えています。

廃棄解除後に page.OnNavigatedTo 内で HTTP リクエストを同期的に完了する方法はありますか?

4

2 に答える 2

0

更新: 別のオプションはReactive Extensionsを使用することです。

VS2010 を使用している場合は、 AsyncCTPをインストールできます。インストールすると、応答を待機できる拡張メソッドが追加されます。

static async Task<Stream> AsynchronousDownload(string url)
  {
    WebRequest request = WebRequest.Create(url);
    WebResponse response = await request.GetResponseAsync();
    return (response.GetResponseStream());
  }

それから:

更新しました:

protected override async void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);

            var myResponse = await AsynchronousDownload("http://stackoverflow.com");
        }

また

VS2012 を使用している場合は、Microsoft.Bcl.Asyncライブラリをインストールして、AsyncCTP を使用している場合と同じことを行うことができますawait

また

Caliburn Micro のコルーチンに似たものを実装できます。このために、IResult インターフェイスを実装します。

 public interface IResult
{
    void Execute(ActionExecutionContext context);
    event EventHandler<ResultCompletionEventArgs> Completed;
}

可能な実装:

public class HttpWebRequestResult : IResult
    {
        public HttpWebRequest HttpWebRequest { get; set; }
        public string Result { get; set; }

        public HttpWebRequestResult(string url)
        {
            HttpWebRequest = (HttpWebRequest) HttpWebRequest.Create(url);

        }

        public void Execute (ActionExecutionContext context)
        {
            HttpWebRequest.BeginGetResponse (Callback, HttpWebRequest);
        }

        public void Callback (IAsyncResult asyncResult)
        {
            var httpWebRequest = (HttpWebRequest)asyncResult.AsyncState;
            var httpWebResponse = (HttpWebResponse) httpWebRequest.EndGetResponse(asyncResult);

            using (var reader = new StreamReader(httpWebResponse.GetResponseStream()))
                Result = reader.ReadToEnd();

            Completed (this, new ResultCompletionEventArgs ());
        }

        public event EventHandler<ResultCompletionEventArgs> Completed = delegate { };
    }

それを呼び出すには:

var httpWebRequestResult = new HttpWebRequestResult("http://www.google.com");
            yield return httpWebRequestResult;
            var result = httpWebRequestResult.Result;

これは、CM からコルーチンの実装を取得し、それを個別に使用する例かもしれません。

于 2012-11-08T06:36:27.257 に答える
0

Microsoft は正当な理由で非同期呼び出しを実行するように実際にプッシュしようとしているということから始めましょう。それが私が強調したかった理由です。

あなたが本当にそれを同期させたいのなら、私は自分自身をテストすることができなかった考えを持っています. HttpWebRequestクラスを使用する場合、BeginGetResponseEndGetResponseの 2 つの重要な関数を使用したことがあると思います。

これら 2 つの機能は密接に連携して機能します。BeginGetResponse非同期の Web リクエストを開始します。リクエストが完了すると、完了すると出力EndGetResponseが得られます。これは、MS がユーザーに許可しようとしている方法です。このようなことを同期的に行う秘訣は、 がIAsyncResultbeginGetResponseを返すことです。このインターフェースには、要求が完了するまで同期的に待機するために使用できるWaitHandlerが含まれています。その後、endGetRequest を続行して、ビジネスを続けることができます。同じことがBeginGetRequestStreamEndGetRequestStreamにも当てはまります。IAsyncResult

しかし、前に言ったように、私はこのソリューションをテストしておらず、純粋に理論上のものです。うまくいったかどうか教えてください。

幸運を!

于 2012-11-08T06:56:15.860 に答える