2017-05-23 10 views
1

私はHTTPだけを受け入れるWCF RESTful Webサービスを開発しています。私は非同期パターンに変更することについていくつか質問があります。私の場合、クライアントは唯一のHTTP動詞をサポートするブラウザ可能性があり、WCFクライアントプロキシに基づく非同期WCF動作契約利用クライアントを実装するためにTPLを使用する方法を示し、それは私のWCFを変更するようだWCFの非同期について

  1. ほとんどすべての例非同期パターンへのサービスはあまり意味がありません。私は、サービスがRESTfulで、各リクエストが処理に時間がかからない場合、非同期に同期してサービスを変更することで多くのメリットは得られません。

  2. 私のサービス運用契約がOneWayサービスであるか、クライアントに何も返されない場合、運用契約はasync Task DoSthAsync()またはvoid DoSth()と定義する必要がありますか?ここでの違いは何ですか?言い換えれば、私はTask.Runを待つ/返すべきかどうか。

  3. 私のサービスでは、HTTP POSTを使用してクライアントから送信される大量のデータを受け取りますが、処理に時間がかかると仮定すると、非同期パターンに変更するとサービスの同時実行性とスループットが向上し、 Task.Run(() => {})代理人でWCFによって処分されていませんか?

+0

WCF内でTPLを使用するか、クライアント側で使用しますか?ほとんどのクライアントが例でwcfプロキシであると言うと、それはTPLを使用するクライアント側です。ブラウザとは何ですか?JavaScriptやブラウザをクライアントとして使用しますか? – CodingYoshi

+0

@コーディングヨシ私はクライアントについて何の仮定もしていません。私は完全にサーバー側に集中しています。 – codewarrior

答えて

0

1.Almost WCFクライアントプロキシに基づく非同期WCF動作契約利用クライアントを実装するためにTPLを使用する方法を示し、全ての例、私の場合、クライアントは唯一のHTTP動詞をサポートするブラウザ可能性があり、それ私のWCFサービスを非同期パターンに変更することは意味がありません。私は、サービスがRESTfulで、各リクエストが処理に時間がかからない場合、非同期に同期してサービスを変更することで多くのメリットは得られません。

質問1は、クライアントサイドではなくWCFサーバー側でTPLを使用したいと言って以来、完全に外れています。

@コーディングヨシ私は顧客に対して何の仮定もしていません。私は完全にサーバー側に集中しています。

2.サービス運用契約がOneWayサービスであるか、クライアントに何も返されない場合、業務契約は非同期タスクDoSthAsync()または無効DoSth()として定義する必要がありますか?ここでの違いは何ですか?言い換えれば、私はTask.Runを待つ/返すべきかどうか。

サービスが非同期であるかどうかをサービス契約で指定しません。それはあなたのサービスの内部です。サービスが非同期に動作しているかどうかにかかわらず、クライアントは依然としてサービスを同期または非同期で呼び出すことができます。たとえば、サービスがファイルに書き込みを行い、書き込みに5分かかり、これを同期的に実行するように実装した場合でも、クライアントはサービスを非同期(または同期)で呼び出すことができます。これを非同期に実装した場合、呼び出しを処理したスレッドプールスレッドは他の呼び出しを自由に処理できます。つまり、変更はサーバー側にのみ影響します。

また、本当に非同期であるものを実行している場合は、非同期で実行すると効果的です。 CPU集約型操作を実行している場合は、非同期で実行すると実際にパフォーマンスが低下します。どうして? ASP.NET(WCF、MVC、Webフォームなど)にリクエストが送信された場合、リクエストを処理する最も効率的な方法は、1つのスレッドプールスレッドを使用してリクエストを処理することです。CPUを集中的に操作してそのスレッドが実行するか、Taskを起動して別のスレッドが引き継いでも、それは変わりません。ただし、コンテキストを切り替えるための料金を支払うことになります。

3.Myサービスは、データの大きなチャンクがHTTP POSTを使用して、クライアントから送信受け入れ、処理は必ずpass-ことを確認するために、どのように、しばらく時間がかかるだろうので、非同期パターンに変更すると、サービスの同時実行性とスループットを向上させることができたとしWCFはTask.Run(()=> {})デリゲートにストリームオブジェクトを配置しませんか?

要求がWCFゲートに到着したときに、非同期または同期で処理するかどうかに関わらず、操作全体が完了しない限り、応答は送信されません。だから、なぜ流れが流れてしまいますか?

私はあなたが非同期概念全体ではっきりしていないと思います。サービスが非同期であるかどうかに関わらず、クライアントは依然として呼び出しがブロックされていないことを確認する必要があります。クライアントが操作を呼び出した場合、彼らはどちらか:

  1. を待ち、彼らは応答を受信し、他には何か
  2. コールサービスもしない、他のことを行うと、応答が戻ると、彼らはハンドルまで応答。
関連する問題