2

私は Metro 開発にまったく慣れていないので、私の質問をわかりやすい方法で表現できることを願っています...

実は、古いアプリケーションの一部を Metro に移植しています。ロジック部分は別のプロジェクト (Portable Library) であり、1) 古い WPF アプリと 2) 新しい Metro アプリに提供する必要があります。基本的なロジックは同じですが、一部のサブシステム (ファイル操作マネージャーなど) は別の方法でコーディングする必要があります。つまり、Metro の場合は非同期です。

私の質問は次のとおりです。呼び出し元と呼び出し先のメソッドのチェーン全体を新しい非同期パラダイムに書き直す必要がありますか? メソッド A = Metro UI イベント非同期ハンドラー (最上位の fire&forget イベントであるため、async void としてコーディングするのが理にかなっています) から始まり、次の 2 つのメソッド (B と C) までの 4 つのメソッドのチェーンがあるとします。 )アプリケーションのさまざまなレイヤーに配置され、「await CreateFileAsync」メソッドを含むメソッドDまで(Microsoftによって非同期化されました)。

現在: async CreateFileAsync メソッドは await で呼び出す必要があります。そのため、メソッド D も非同期にする必要があります。メソッド D を C から、C を B から、B を A から呼び出すには、すべての A、B、および C を async-await スタイルに書き直す必要がありますか?

より深い知識が欠けていると感じているので、自分自身を教育しようとしていますが、同時にここで運試しをしたかったのです...

コードの大部分を書き直す必要がありますか? 上記の私の発言のいずれかが間違っていますか?

事前に感謝します、ハンス

4

1 に答える 1

4

ポータブル ライブラリを非同期になるように書き直すことをお勧めします。以前ほど悪くはありません。asyncMicrosoft は、 /await同期コードを非同期コードに変換するのをできるだけ簡単にするために非常に熱心に取り組みました。近い将来、他の多くの人が同じことをするだろうと私は予想しています.R#はおそらく「make async」の書き換えを実装するでしょう.

同期コードと非同期コードを混在させると、明らかでない落とし穴があります。Stephen Toub の最後のブログ投稿を参照してくださいこのため、非同期操作を非同期 API (および同期操作を同期 API) として公開する方がクリーンだと思います。

更新:同期コードで非同期コードを呼び出したい場合は、私の AsyncEx ライブラリTask.WaitAndUnwrapExceptionの拡張メソッドを使用できます。ただし、Stephen Toub の投稿で言及されている問題、つまり次のような問題がまだ残っています。

  1. ConfigureAwait(false)ライブラリがどこでも使用できない場合、デッドロックが発生する可能性があります。
  2. スレッド プール内のスレッドが最大数に達した場合にも、デッドロックが発生する可能性があります。

(2) はもはや一般的ではありませんが、(1) は実際に可能性があります。これは、テスト中の人によって定期的に持ち出さasyncれるため、同期コードと混合されます。

于 2012-04-16T23:52:30.530 に答える