1

現在 WinRT に移植されている、長い間確立された非常にマルチプラットフォームなコードベースがあります。私たちが直面している課題の 1 つは、WinRT の非同期スタイルを処理する方法です。

たとえば、WinRT の非同期ファイル操作を処理する方法がわかりません。当然のことながら、私たちのコードベースの API は同期的です。典型的な例は File::Open 関数で、ファイルを開こうとして成功または失敗を返します。WinRT 関数を呼び出しながら、関数の動作を同じに保つにはどうすればよいでしょうか?

残念ながら、レガシーによって制限されていることに注意してください。単純に API を変更して非同期にすることはできません。

ありがとう!

4

2 に答える 2

6

ライブラリを再実装して WinRT アプリをサポートする一方で、API の定義を変更せずに、既存のアプリケーションの互換性を維持したいと考えていると思います。

非同期メソッドを呼び出すときに await キーワードを含めないと、非同期操作を行わず、同期的に実行する必要があると思います。しかし、メソッドが値を返す場合、実際には機能しません (私の経験では)。

このコードを使用して、ファイル操作を同期させています。

IAsyncOperation<string> contentAsync = FileIO.ReadTextAsync(file);
contentAsync.AsTask().Wait();
string content = contentAsync.GetResults();
于 2012-10-10T16:42:30.080 に答える
2

async/await をサポートしていないプラットフォームとコードを共有したい場合は、古いプラットフォーム用と新しいプラットフォーム用に別の API を用意し、次のようなスイッチを使用する方がよいでしょう。

#if SILVERLIGHT
#elif NETFX_CORE
#elif WPF
#endif

最終的に、非同期 API は古いプラットフォームで表示される可能性が高く、非非同期呼び出しを実際にタスクにラップして、そうでない場合は非同期にすることができます。非同期メソッドを強制的に同期的に動作させると、すぐに苦しむことになります。たとえば、WinRT アプリが数秒間応答しなくなり、OS によって強制終了される可能性があります。または、タスクの完了を待ってデッドロックが発生し、完了しようとするスレッドがブロックされる可能性があります。

于 2012-10-10T16:51:48.680 に答える