2

await の最初のニュースを見たとき、私はとても興奮し、さまざまな使い方を考えました。これらの 1 つは、いくつかのフレームワークで行われているように、クライアント/サーバー交換の非同期の側面を隠すために、私の Web フレームワークで使用することです。だからここに契約があります:

以下のようなことを書きたいと思います。

{   
    Page p = new Page();
    FormResponse response = await p.Show();
    var field1 = reponse.inputField["input1"];
    ...
}

開発者がサーバー上でこのコードを記述できるようにしたいと考えています。ご想像のとおり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 サーバーに送信することと同じです。

よろしく、ジュリアン

4

1 に答える 1

0

何が問題なのかわからない。

たとえば、ASP.NET 非同期ページがある場合、最上位の ( async void) 関数は、ページが不完全であることを ASP.NET に適切に通知し、スレッドを解放します。その後、継続は (おそらく別の) スレッドで実行され、リクエスト コンテキストを復元し、リクエストを終了します。

このasync正確な動作を可能にするために、設計は慎重に行われました。特に、最近の MSDN 記事 で説明したように、async voidの未処理の非同期操作カウントを増やします。SynchronizationContext

独自のホストを実行している (つまり、ASP.NET を使用していない) 場合は、SynchronizationContext. それは自明ではありませんが、非常に難しいことでもありません。これが完了するasyncと、 await「そのまま動作」します。:)

編集に応じて回答を更新しました:

await/asyncは単なる構文糖衣であることを覚えておいてください。以前は不可能だったことを可能にするわけではありません。単に簡単にするだけです。

私があなたの状況を正しく理解していれば、あなたは Web サービスが UI を返し、それに応答することを望んでいます。これは HTTP の動作の逆なので、viewstate でちょっと変わったことをしなければなりません。考えておく...

于 2011-09-30T16:09:03.317 に答える