問題タブ [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.
c# - AsyncCTP: IAwaitable クラスの作成
IAwaitable クラス (スレッドをブロックせずに非同期呼び出しを実装するもの) を実装したいと思っていました。
最新バージョンの AsyncCTP をインストールしましたが、コンパイラは IsCompleted() メンバーが必要だと言っています。さて、CTP のプレビューが少し進みました (プレビューのようにわかります)。
質問: AsyncCTP 言語拡張機能が現在期待しているインターフェイスは何ですか?
質問:このすべてにおいて、ラムダ/デリゲートを介して「IAwaitable」にシグナルを送ることができると仮定していますか? これは可能ですか?EndAwait を呼び出しますか? インテリセンスは、EndAwait を呼び出して結果を取得することを提案しているため、正しく聞こえません。何か案は?
これまでに見つけた例はすべて、AsyncCTP ライブラリが既に実装している次のような機能に関するものです。
バックグラウンド:
Jon Skeets のページ (再び) で、この例を見ています。
c# - タスクを待機可能にする方法
昨日、Microsoft CTP 非同期ライブラリを使い始めましたが、待機可能なタスクの適切な実装がどこにも見つかりませんでした。私はそれがこのような実装を持っている必要があることを知っています?:
しかし、たとえば 5 秒間待機して、"Hello World" などの文字列を返すタスクを実装するにはどうすればよいでしょうか。
1 つの方法は、次のように Task を直接使用することです。
しかし、待機可能な実装でそれを行うにはどうすればよいでしょうか? それとも、すべてを誤解しただけですか?
情報/ヘルプをありがとう:)
.net - async の戻り値の型が void、Task、または Task でなければならない理由
私は非同期 CTP で手を汚そうとしていますが、コンパイラが非同期の戻り値の型について不平を言っていることに気付きました。他のタイプの問題点は何ですか?
簡単なデモ
c# - C# Async CTP で「待機中」のスレッドはどうなりますか?
私は新しい asyncawait
キーワードについて読んでいて、それは素晴らしいように聞こえますが、これまでに見たどの紹介ビデオでも答えを見つけることができなかった重要な質問が 1 つあります (ホワイトペーパーも読みました)。ちょっと前)。
await
メイン UI スレッドのネストされた関数で呼び出しがあるとします。この時点でスレッドはどうなりますか?制御はメッセージ ループに戻り、UI スレッドは自由に他の入力を処理できますか?
待機中のタスクが完了すると、スタック全体がメッセージ キューにプッシュされ、ネストされた各関数を介して制御が返されますか?それとも、ここで何か別のことが完全に発生していますか?
第二に (注意を喚起している間)、非同期メソッドに というラベルを付ける必要がある理由がよくわかりませんasync
。非同期で実行できるメソッドはありませんか? メソッドを非同期で実行したいが、 async キーワードがない場合はどうすればよいですか? 簡単に実行する方法はありますか?
乾杯。:)
編集: 確かに、サンプルコードをコンパイルできれば、おそらく自分でそれを理解できるでしょうが、何らかの理由でブロックに遭遇しています。私が本当に知りたいのは、継続がどの程度継続するかです...コールスタック全体をフリーズして、タスクが完了したときに再開しますか、それともそれまでに戻るだけですか? 継続をサポートするために、関数自体を非同期としてマークする必要がありますか、それとも (最初に尋ねたように) コール スタック全体を継続しますか?
コール スタック全体がフリーズしない場合、async await が非非同期呼び出し関数にヒットするとどうなりますか? そこでブロックしますか?それはawaitのポイントを打ち負かしませんか?ここで私が理解していないことがわかると思います.誰かが記入してくれることを願っています.
task-parallel-library - Silverligh 5 SDK RC + Async CTP : 動作させる
Silverlight 5 SDK RC をインストールしました。Async CTP を使用するプロジェクト内で使用すると問題が発生します。
AsyncCtpLibrary_Silverlight.dll と mscorlib.dll の両方に、まったく同じ名前空間にある Task タイプ (およびその他の Task 関連タイプ) が含まれています。
エラーメッセージは次のとおりです。
このあいまいさを解決するために、AsyncCtpLibrary_Silverlight.dll のエイリアスを「AsyncCtp」に変更しました。それに応じて cs ファイルを変更します。
これであいまいさの問題は解決したようですが、「async」キーワードが認識されなくなりました。関連するエラーは次のとおりです。
それを回避する方法はありますか、それとも行き止まりですか?
playframework - Controller.await(int millis) の後にアクション チェーンがリダイレクトされない
これが意図したとおりに機能しないかどうかはわかりませんが、私が混乱しているだけです。
私がやりたいのは、非同期にアクションを遅らせることであり、await(int millis)
友達になれそうです。
何が起こるかは次のとおりです。
1. Application.index
に POST を送信するフォームを表示しますApplication.something
。
アプリ/コントローラー/Application.java
アプリ/ビュー/アプリケーション/index.html
2. Application.something
はその処理を実行し、チェーンを に戻しindex
ます。
アプリ/コントローラー/Application.java
3. Play でアプリケーション エラーが発生します: 「テンプレート Application/something.html が存在しません」。
したがって、での実行が一時停止/再開された後にrender()
が呼び出されると、 のテンプレートをレンダリングしようとしますが、もちろん存在しません。Application.index
Application.something
Application.something
すべてを削除するとawait(500)
、問題なく動作します (302 が発行index
され、期待どおりにレンダリングされます)。
私はリダイレクトを強制することができます
私が望む結果を得ることができますが、これは醜いです。
設定もできます
の直後に手動でawait
レンダリングし、意図したとおりに機能しApplication.index
ます(実際には魔法が機能します)。Controller.template()
await
基本的に、すべて問題なく、メソッド呼び出しではなく文字列を使用することを余儀なくされていますか、それとも少しずれていますか?
乾杯、トバイアス。
c# - タスク内で例外をスローする - "await" vs Wait()
TPL では、Task 内で例外をスローすると、AggregateException でラップされます。しかし、 awaitキーワード
を使用すると、同じことは起こりません。
その動作の説明は何ですか?
c# - C#の新しい非同期機能を使用してネットワークパケットを待機するための最良の方法は何ですか
最近、新しい非同期CTPをいじってみましたが、どうすればよいかわからないという状況に遭遇しました。
現在のコードベースでは、「ジョブ」と「ジョブマネージャー」の概念を使用しています。ジョブは、最初のメッセージを処理し、応答を送信して、応答を待機することのみを目的として存在します。
ネットワークスレッドがデータの到着を待機し、それをイベントハンドラーに渡し、最終的にはジョブマネージャーに渡す、同期ソケットに基づく既存のコードがすでにあります。
ジョブマネージャは、メッセージを処理するジョブを探し、メッセージを渡します。
したがって、シナリオは次のとおりです。
- ジョブマネージャは新しいメッセージを受け取り、ジョブを起動します。
- ジョブが開始され、メッセージが処理され、応答メッセージが送信されます。
- この時点で、ジョブは応答への応答を待ちます。
擬似コードの例を次に示します。
しかし、ステップ3でどのように進めるかは完全にはわかりません。ジョブマネージャーは応答を取得し、実行中のジョブに渡します。しかし、ジョブに応答を待たせる方法がわかりません。
WaitHandleをブロックするだけの待機中のタスクを作成することを検討しましたが、これが最善の解決策ですか?
この場合、他にできることはありますか?
編集 非同期CTPに関して、UIが使用されていない状況で何が起こるか。Eric LippertのAsyncブログを読んだことがありますが、UIスレッドなしですべてがバックグラウンドでどのように機能するかというテーマに触れたことはないと思います(バックグラウンドワーカーからスピンオフするのでしょうか...?)
c# - ロックステートメントの本文内で「await」演算子を使用できないのはなぜですか?
C#(.NET Async CTP)のawaitキーワードは、lockステートメント内からは許可されていません。
MSDNから:
await式は、同期関数、クエリ式、例外処理ステートメントのcatchまたはfinallyブロック、lockステートメントのブロック、または安全でないコンテキストでは使用できません。
これは、コンパイラチームが何らかの理由で実装するのが難しいか不可能であると思います。
usingステートメントで回避策を試みました。
ただし、これは期待どおりに機能しません。ExitDisposable.Dispose内のMonitor.Exitの呼び出しは、(ほとんどの場合)無期限にブロックされ、他のスレッドがロックを取得しようとするときにデッドロックが発生するようです。私の回避策の信頼性の低さと、ロックステートメントで待機ステートメントが許可されない理由は何らかの形で関連していると思います。
ロックステートメントの本文内で待機が許可されない理由を誰かが知っていますか?
c# - 継続状態の保存/復元アルゴリズムをオーバーライドしますか?
await の最初のニュースを見たとき、私はとても興奮し、さまざまな使い方を考えました。これらの 1 つは、いくつかのフレームワークで行われているように、クライアント/サーバー交換の非同期の側面を隠すために、私の Web フレームワークで使用することです。だからここに契約があります:
以下のようなことを書きたいと思います。
開発者がサーバー上でこのコードを記述できるようにしたいと考えています。ご想像のとおりp.Show()
、HttpResponse に、フォームを含むページを表示する html コードを記述し、応答をクライアントに送信すると、スレッドが強制終了され、次の命令 ( FormResponse response =
) に到達しません。
だからここに私の質問があります:そのようなことをする方法はありますか?コードを切り取り、継続にパックし、クロージャを作成し、p.Show() が完了したときにコールバックするためにどこかに保存することを知っています。しかし、ここでは、スレッドが強制終了されます。これは、処理する必要がある Page から送信応答を受信する私のコードです。そのため、「await」が作成した継続を復元し、自分で実行する必要があります。
私はハイになっていますか、それとも可能ですか?
編集:追加情報
もう少し説明できますが、例が必要です。Web サービスへの非同期呼び出しを行いたいと想像してください。await を使用してから Web を呼び出すだけです。Web ではページが表示されず、情報が返され、次の手順に進むことができます。Web では次のようになります。クライアント -> サーバー A [-callwebs-> サーバー B ->] サーバー A -> クライアント。
ここで、ユーザーから情報を取得するためにユーザー インターフェイスを表示する必要がある Web を想像してください。この種の Web を UIweb (複数の Web アプリケーションによって呼び出される再利用可能なインターフェイス) と呼び、UI を表示し、情報を取得し、送信します。呼び出し元に戻します。
クライアント -> サーバー A [-response_redirect-> クライアント -get-> サーバー B (ここに UIweb があり、クライアントは何でも入力します) -response_redirect-> クライアント -get-> ] サーバー A ->クライアント
括弧の間に入れたものは、開発者が処理する必要があります:
したがって、従来の Web の場合、非同期ページが Web の応答を待って「スリープ状態」になっていると想像できますが、UI Web では応答してクライアントにリダイレクトする必要があるため、ページは asp.net 用に作成され、SynchronizationContext は次のように述べています。待機する非同期命令がもうないことを確認します。
実際、ここでの私の必要性は、Web サーバーをオンにして、await の直後にコードを実行するために必要なすべてを復元する要求を Web サーバーに送信することと同じです。
よろしく、ジュリアン