3

この質問の動機は、同期メソッドを持つ既存のneo4jRestAPIクライアントを使用する.netWebAPIプロジェクトを作成しているためです。非同期メソッドを使用することでパフォーマンスが向上することを利用したいのですが、neo4j apiライブラリにアクセスして、同期メソッドをリファクタリングして非同期メソッドを返すことは避けたいと思います。同期メソッドへの呼び出しをawaitTask.Run()でラップすることは、まったく有益であるかどうか疑問に思いました。具体的には、httpClientからの非同期結果がWait()メソッドを呼び出したときに最初の例で何が起こるかですが、すべてが別のawaitにラップされています。

また、これをAppHarborクラウドで実行し、単一の仮想コアであると信じていることにも注意してください。

だから次は

  //what happens with the synchronous rest api client I am using
  HttpResponseMessage SendHttpRequest(HttpRequestMessage request)
  {

        var requestTask = httpClient.SendAsync(request);
        requestTask.Wait();
        return requestTask.Result;

  }

  object result = await Task.Run(() =>
  {
      return SendHttpRequest(request);
  });

パフォーマンスは

 return httpClient.SendAsync(request)
4

2 に答える 2

8

非同期メソッドを使用することでパフォーマンスが向上することを利用したいのですが、neo4j apiライブラリにアクセスして、同期メソッドをリファクタリングして非同期メソッドを返すことは避けたいと思います。

async申し訳ありませんが、同期コードをでラップするだけでは、サーバー側のすべての利点が失われTask.Runます。

async非同期操作はスレッドよりも拡張性が高いため、サーバーに適しています。ただし、を使用している場合Task.Runは、とにかくスレッドを使用しています。

于 2012-10-26T04:20:28.953 に答える
3

違いは、Task.Runメソッドがスレッドプールで同じブロッキングコードを実行するだけであるということです。つまり、呼び出し元のスレッドはブロックされませんが、実行スレッドはブロックされます。

これがどれほど重要かは、リソースとパフォーマンスの考慮事項に完全に依存します。

SendHttpRequestメソッドが本当にhttpClient.SendAsyncタスクを待機している場合は、そのメソッドを回避して次のように記述できます。

object result = await httpClient.SendAsync(request);

または:

object result = await Task.Run(async () => await httpClient.SendAsync(request));

それでもSendAsyncタスクを別のスレッドで実行する必要がある場合。

于 2012-10-25T16:35:05.180 に答える