2

WPF アプリ、Windows Phone 8 アプリ、およびそれ以降の Windows 8 / RT アプリの両方で使用できるライブラリを設計 / 再利用するには、いくつかの HttpWebRequest 呼び出しを、できれば既存のアプリを壊さないように同期的に行う必要があります。

問題は、Web リクエストを同期的に行うために ManuelResetEvent を使用するコードが既に配置されていることです。WPF と Win 8 RT では完全に動作しますが、Windows Phone 8 (少なくともエミュレーターでは) では、次のようにプログラムがハングします。

WP7 での HttpWebRequest を使用した ManualResetEvent

タスクまたはスレッドで呼び出しをカプセル化するために両方を試しましたが、それでも同じです。

そこで、async / await を使用するようにコードを変更しました。これはもちろん WP8 と Win 8 に最適ですが、デスクトップ アプリは XP との互換性のために .NET 4.0 フレームワークをターゲットにしています。確かに、Visual Studio 2012 用の Async Targeting Pack がありますが、これには 2 つの問題があります。

  • デスクトップ アプリのコードを書き直すか、async / await で慎重にテストする必要があります
  • Mono の安定版リリースは async / await をサポートしていません (おそらく、Windows で Async Targeting Pack を使用してコンパイルし、Mono ランタイムで実行すると動作する可能性があります。テストする必要があります)。

そこで、確認のために、非同期タグ付きメソッドを同期的に呼び出そうとしました。ここで指定された AsyncHelpers を使用しました:

非同期の Task<T> メソッドを同期的に実行するにはどうすればよいですか?

WPF および Win 8 アプリでは動作しますが、Windows Phone 8 ではハングします。

Windows Phone にハングアップすることなくどこでも使用できる同期コード (または await / async を使用した同期コード) を作成する方法を誰かが知っていますか?

4

2 に答える 2

0

HttpWebRequest は UI スレッドを使用してリクエストを処理します。理由は聞かないでください。

したがって、UI スレッドをロックして結果を待機しようとすると、リクエストが完了するまで UI スレッドをロックし、UI スレッドがロックされている間はリクエストが完了しないため、デッドロック状態になります。

于 2014-11-07T10:24:34.850 に答える
0

TaskのResultプロパティをクラウドで使用している可能性があります。.NET 4.0/4.5 および Windows Phone 8 で動作します。

于 2013-03-17T15:41:26.110 に答える