問題タブ [async-await]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
asynchronous - C# 5.0 非同期はどのように機能しますか?
C# 5 の新しい非同期機能がどのように機能するかを理解しようとしています。架空の IntStore で整数をインクリメントするアトミック インクリメント関数を開発したいとします。この関数への複数の呼び出しは、1 つのスレッドでのみ行われます。
この機能に欠陥があるように私には思えます。IncrementKey を 2 回呼び出すと、IntStore から同じ数値 (たとえば 5) が返され、それが 6 に設定されて、増分の 1 つが失われる可能性があります。
IntStore.Get が非同期 (Task を返す) の場合、正しく動作するためにこれをどのように書き直すことができますか?
パフォーマンスは重要です。ロックを回避するソリューションはありますか?
c# - await からの再開はどのように実装されていますか?
私は、C# 5 の非同期性に関する Eric Lippert のブログ記事を読んでおり (パート 4が特に関連しています)、Anders PDC10 がこの件について話しているのを見てきましたが、シングル スレッド コンテキストで非同期メソッドからの継続がどのように再開されるかについては不明です。
どちらの情報源も、単一のスレッド化された UI ループで非同期メソッドを使用して応答性を向上させることについて議論しており、Anders の例では、非同期タスクが完了すると、メッセージ ポンプにメッセージを追加することによって継続がスケジュールされると述べています。
非同期メソッドは、コンテキスト固有のアクションのように見えるものを実行する必要があることを本当に認識していますか?それとも単純化されたものですか?
より一般的には、単一のスレッド化されたコンテキストで非同期メソッドからの再開をどのように処理できるでしょうか? 単一のスレッド内でスケジューリングする必要はありますか?
c# - asyncvoidメソッドによってスローされた例外をキャッチします
Microsoft for .NETの非同期CTPを使用して、呼び出し元のメソッドで非同期メソッドによってスローされた例外をキャッチすることは可能ですか?
ですから、基本的には、非同期コードからの例外が、それが可能であるとしても、呼び出し元のコードにバブルアップすることを望んでいます。
c# - 非同期CTPなしでawaitを実装する方法
await
Async CTPキーワードと同様に機能するものをどのように実装しますか?await
すべての場合のように機能する単純な実装はありますか、それともawait
シナリオごとに異なる実装が必要ですか?
c# - foreach の並列プリフェッチを作成する方法
C#、TPL、Parallel Extensions、Async CTP、Reactive Extensions で非同期操作を実行する新しい方法が多数あることを考えると、次のフェッチと処理の部分を並列化する最も簡単な方法は何だろうと考えていました。
ただし、ファイルはいつでも取得できますがProcessFile
、一度に 1 つのファイルしか処理できず、順番に呼び出す必要があります。
要するに、パイプライン化された方法で取得FetchFile
および動作する最も簡単な方法、つまり同時に発生する方法は何ですか?ProcessFile
c# - C ++ std :: async vs async / await in C#
新しいc++機能std::async
が2つのC#キーワードasync / awaitに非常に匹敵するかどうか、そうでない場合はその理由を知りたいのですが。
c# - C#でのMongoDBへの非同期挿入
C#でMongoDBへの非同期挿入/更新を行うにはどうすればよいですか?怠惰な永続性の用語は何ですか?
- 後書き
wcf - エンティティのナビゲーション プロパティは、WCF サービスを介してプリロードまたは遅延ロードする必要がありますか?
WCF サービスで自己追跡エンティティを使用しています。エンティティは、ナビゲーション プロパティが読み込まれずにクライアントに返されます。
すべてのナビゲーション プロパティを一度に送信するのと、必要に応じて遅延ロードするのとではどちらがよいでしょうか? レイジー ロードの場合、非同期でロードすることをお勧めしますか? これまでに行ったすべての WCF サービス呼び出しでは、await/async キーワードを使用しています。
一部のオブジェクトには、常に使用されるとは限らない多くのナビゲーション プロパティがあるため、一度にすべてをロードすることに懸念があります。たとえば、Consumer エンティティには現在約 20 があり、さらに増えることが予想されます。例としては、住所、電話、ドキュメント、メモなどがあります。ユーザーは独自の作業領域をセットアップできるため、コンシューマが読み込まれるときにドキュメントを操作する人は常に Documents プロパティを必要とする場合がありますが、他のほとんどの人は不要です。
c# - WCF サービスを介して分離された自己追跡エンティティの非同期遅延読み込みナビゲーション プロパティ?
MVVM で構築された WPF アプリケーションに自己追跡エンティティを渡す WCF クライアントがあります。アプリケーション自体には動的インターフェースがあります。ユーザーは、自分の役割や実行しているタスクに応じて、作業領域に表示するオブジェクトを選択できます。
私の自己追跡エンティティにはかなりの数のナビゲーション プロパティがあり、それらの多くは必要ありません。これらのオブジェクトの一部は非常に大きくなる可能性があるため、これらのプロパティは要求があった場合にのみロードしたいと考えています。
私のアプリケーションは次のようになります。
[WCF] <---> [ClientSide Repository] <---> [ViewModel] <---> [View]
私のモデルは自己追跡エンティティです。クライアント側リポジトリは、要求元の ViewModel にモデルを返す前に、必要に応じて LazyLoad メソッドをフックします。すべての WCF サービス呼び出しは非同期です。つまり、LazyLoad メソッドも非同期です。
LazyLoad の実際の実装で問題が発生しています。ここに私が思いついたオプションがあります。
編集 - コードサンプルを削除して、これを読みやすく理解しやすくしました。見たい場合は、以前のバージョンの質問を参照してください
オプション A
Getter で WCF サーバーからモデルのプロパティを非同期的に LazyLoad する
良い:オンデマンドでのデータの読み込みは非常に簡単です。XAML のバインドによってデータが読み込まれるため、コントロールが画面上にある場合、データは非同期に読み込まれ、そこにあるときに UI に通知されます。そうでない場合、何もロードされません。たとえば<ItemsControl ItemsSource="{Binding CurrentConsumer.ConsumerDocuments}" />
、データをロードしますが、インターフェイスのドキュメント セクションが存在しない場合は何もロードされません。
悪い例:空のリストを返すため、このプロパティを開始する前に他のコードで使用することはできません。たとえば、ドキュメントが読み込まれていない場合、次の呼び出しは常に false を返します。
オプション B
必要に応じて手動で呼び出してデータをロードする
良い:実装が簡単 -メソッドLoadConsumerDocumentsSync()
とLoadConsumerDocumentsAsync()
メソッドを追加するだけ
悪い例: Bindings で使用する場合を含め、データにアクセスする前にデータをロードすることを忘れないでください。これは簡単に思えるかもしれませんが、すぐに手に負えなくなる可能性があります。たとえば、各 ConsumerDocument には UserCreated と UserLastModified があります。拡張機能、電子メール、チーム、ロールなどの追加のユーザー データを表示する ToolTip を使用して UserModel を定義する DataTemplate があります。そのため、ドキュメントを表示する ViewModel では、 を呼び出してからLoadDocuments
、それらをループして and を呼び出す必要がLoadConsumerModified
ありLoadConsumerCreated
ます。それも続くかもしれません...その後、私はしなければなりませLoadUserGroups
んLoadUserSupervisor
. また、 a のようなものがプロパティをUser
持ち、 aがプロパティを持つ循環ループのリスクを冒します。Groups[]
Group
Users[]
オプション C
これまでのところ私のお気に入りのオプションは... プロパティにアクセスする 2 つの方法を作成することです。1 つの同期と 1 つの非同期。バインドは Async プロパティに対して行われ、すべてのコードで Sync プロパティが使用されます。
良い:データは必要に応じて非同期に読み込まれます - まさに私が望むものです。これらの追加のプロパティ/メソッドを生成するために T4 テンプレートを変更するだけでよいため、追加のコーディングはそれほど多くありません。
悪い例:同じデータにアクセスする方法が 2 つあると、効率が悪く、混乱を招きます。Consumer.ConsumerDocumentsAsync
の代わりにいつ使用する必要があるかを覚えておく必要がありますConsumer.ConsumerDocumentsSync
。WCF サービス呼び出しが複数回実行される可能性もあります。これには、IsConsumerDocumentsLoaded などのすべてのナビゲーション プロパティに追加の IsLoaded プロパティが必要です。
オプション D
非同期ロードをスキップし、セッターですべてを同期的にロードします。
良い:非常にシンプルで、余分な作業は必要ありません
悪い:データの読み込み時に UI がロックされます。これはいらない。
オプション E
SOの誰かに、これを行う別の方法があることを教えてもらい、コードサンプルを教えてもらいます:)
その他の注意事項
一部の NavigationProperties は、オブジェクトをクライアントに返す前に WCF サーバーに読み込まれますが、それ以外はコストが高すぎてそれを行うことができません。
オプション C の Load イベントを手動で呼び出すことを除いて、これらはすべて T4 テンプレートを介して実行できるため、私が行うコーディングはほとんどありません。私がしなければならないことは、クライアント側のリポジトリで LazyLoad イベントをフックし、それを適切なサービス呼び出しに向けることだけです。
asynchronous - awaitを使用した複数の並列非同期呼び出し
私の知る限り、ランタイムが以下のステートメントに出くわすと、非同期で呼び出されるメソッドへのコールバックとして関数の残りの部分をラップします(someCall()
この例では)。この場合、 :anotherCall()
へのコールバックとして実行されます。someCall()
ランタイムを次のように実行できるかどうか疑問に思いますsomeCall()
。非同期で呼び出し、すぐに呼び出し元のスレッドに戻ってから、anotherCall()
同様に呼び出します(完了するのを待たずsomeCall
に)。非同期で実行するにはこれらの2つのメソッドが必要であり、これらの呼び出しは単なるファイアアンドフォーゲットコールであると想定しているためです。
async
and await
(古いbegin
/end
メカニズムを使用しない)だけを使用してこのシナリオを実装することは可能ですか?