問題タブ [async-ctp]
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.
c# - await 呼び出しが含まれている場合でも、非同期でマークされたメソッドが同期的に実行される原因は何ですか?
同僚が留守中に書いたコードをデバッグしようとしています。
呼び出しは次のとおりです。
メソッドのシグネチャは次のとおりです。
このメソッドの実行には約 20 秒かかります。ログによると、上記の最初の行の直前と直後に配置すると、そのasync
部分が無視されているかのように、タスクが同期的に実行されています。これが起こる原因は何ですか?
await
async メソッド内に呼び出しがあることに注意してください。それが違いを生むとは想像できませんが、それはwhileループの中にあります。
また、非常に単純な async/await セットアップを実行する小さなテスト アプリを作成して、実行しているサーバーで await が実際に動作することを確認し、メインではなく、小さなテスト ケースで正しく動作することを確認しました。デバッグしようとしているアプリ。
c# - 非同期CTP-タスクスケジューリングに推奨されるアプローチ
私は現在、全体でTAPを使用する大部分が非同期のアプリケーションに取り組んでいます。Task
sを生成するためのメソッドを持つすべてのクラスには、sがTaskScheduler
注入されています。これにより、タスクの明示的なスケジューリングを実行できます。これは、私が理解しているように、MicrosoftがAsyncCTPを使用する方法ではありません。
新しいアプローチ(暗黙的なスケジューリング)で私が抱えている唯一の問題は、以前の哲学は常に「継続によって常にタスクスケジューラが指定されることを知っているので、タスクを完了するコンテキストについて心配する必要がない」ということです。 。
微妙なスレッドエラーを回避するという点で非常にうまく機能しているという理由だけで、それから離れることは少し心配です。コードのすべてのビットについて、コーダーが自分がどのスレッドを使用しているかを考慮することを覚えていることがわかります。彼らがタスクスケジューラを指定しなかった場合、それはバグです。
質問1:暗黙のアプローチが良い考えであることを誰かが私に安心させることができますか?ConfigureAwait(false)と、レガシー/サードパーティのコードでの明示的なスケジューリングによって、非常に多くの問題が発生しているのがわかります。たとえば、「await-ridden」コードが常にUIスレッドで実行されていることを確認するにはどうすればよいですか?
質問2:では、コードからすべてのDIを削除し、暗黙的なスケジューリングの使用を開始すると仮定するTaskScheduler
と、デフォルトのタスクスケジューラをどのように設定しますか?メソッドの途中で、高価なメソッドを待つ直前にスケジューラーを変更し、その後再び設定するのはどうですか?
(ps私はすでにhttp://msmvps.com/blogs/jon_skeet/archive/2010/11/02/configuring-waiting.aspxを読んでいます)
c# - 非同期高速パス
これは、非同期 CTP 更新が非同期の「高速パス」を利用する方法に関する記事です。
効率の向上などについて言及していますが、「高速パス」が何であるかさえわかりませんか?この記事のヒントが自分に関連しているかどうかを判断したいのですが、「高速パス」の説明が本当に見つかりませんか?
c# - 非同期CTP-アンビエントキャンセルトークンとIProgress
Async CTPはアンビエントを介した暗黙のスケジューリングを促進することを念頭に置いて、私もアンビエントSynchronizationContext
を作成すべきではない理由はありますか?CancellationToken
IProgress
私は現在TaskScheduler
、明示的なスケジューリングのためにアラウンドを渡すのと同じように、これらをメソッドに渡します。ただし、スケジューラーがアンビエントであると想定されているので、パズルの他の部分についても同じルールに従うのではないでしょうか。
c# - Async CTP を利用し、InvalidOperationException "Task_Start_NullAction" をスローする C# コード
d2 への非同期呼び出しを行う QueryJourneys を呼び出しますが、WebClient を使用して一部のコンテンツ (XML) を非同期でダウンロードしようとすると失敗します。
唯一のメッセージとして文字列"Task_Start_NullAction"を含む例外InvalidOperationExceptionを取得します。
なにが問題ですか?
呼び出しコード:
例外をスローする背後にあるコード:
.net - 既存の非同期メソッドを TPL 互換メソッドにラップする
コールバック関数をパラメーターとして受け入れる既存の非同期メソッドをタスク並列ライブラリ互換メソッドにラップする方法は?
c# - 非同期 CTP のパフォーマンスが悪いのはなぜですか?
理由がよくわかりません。ここでコードのパフォーマンスが改善さawait
れません。async
懐疑的ではありますが、ダウンロードが並行して行われるようにコンパイラがメソッドを書き直すはずだと思っていましたが、実際にはそうではないようです。
(私はそれを認識してawait
おり、async
別のスレッドを作成していません。ただし、OSはダウンロードを並行して実行し、元のスレッドでコードをコールバックする必要があります-そうではありませんか?)
不適切に使用しasync
ていますか? await
それらを使用する適切な方法は何ですか?
コード:
出力:
c# - 暗黙的にスケジュールされたメソッドの TaskScheduler を明示的に指定する
暗黙のスケジューリングを使用する次の方法があります。
ただし、特定の呼び出しサイトから、デフォルトではなく優先度の低いスケジューラで実行したい:
どうすればこれを達成できますか? とても単純な質問のように思えますが、私は完全なメンタルブロックを抱えています!
注: この例が実際にはコンパイルされないことは承知しています :)
system.reactive - rx リアクティブ拡張:各サブスクライバーがオブザーバブルから異なる値 (次の値) を取得する方法は?
リアクティブ拡張を使用すると、同じオブザーバブルに 2 回サブスクライブするのは簡単です。オブザーバブルで新しい値が利用可能になると、両方のサブスクライバーがこの同じ値で呼び出されます。
このオブザーバブルから各サブスクライバーに異なる値 (次の値) を取得させる方法はありますか?
私が求めているものの例:
ソース シーケンス: [1,2,3,4,5,...] (無限)
ソースは未知の速度で常に新しいアイテムを追加しています。
N サブスクライバーを使用して、アイテムごとに長時間の非同期アクションを実行しようとしています。
1 番目の加入者: 1,2,4,...
2 番目の加入者: 3,5,...
...
または
1 番目の加入者: 1,3,...
2 番目の加入者: 2,4,5,...
.. .
または
1 番目の加入者: 1,3,5,...
2 番目の加入者: 2,4,6,...