「CPU集約型」でないものに対してのみasyncを使用すべきであることがわかっています。ファイルの書き込み、Web呼び出しなどがあります。したがって、すべてのメソッドをTask.Run
またはそれに類するものにするのは意味がありません。非同期メソッド(Web呼び出しを行う)を非同期にラップする
しかし、メソッドがWeb呼び出しを行うが、非同期インターフェイスを提供していないことを知っているとき、私は何をすべきですか?この場合、それをラップする価値はありますか?
具体例:私は私のWEBAPIアプリケーション(サーバー)にCSOM(クライアントのSharePointオブジェクトモデル)を使用してSharePointリストを取得したいよ
。
これは通常、次のように行われます。
[HttpGet]
[Route("foo/{webUrl}")]
public int GetNumberOfLists(string webUrl)
{
using (ClientContext context = new ClientContext(webUrl))
{
Web web = context.Web;
context.Load(web.Lists);
context.ExecuteQuery();
return web.Lists.Count;
}
}
そして、私はこのような何かにそれを変更する方法について考えた:
[HttpGet]
[Route("foo/{webUrl}")]
public async Task<int> GetNumberOfLists(string webUrl)
{
using (ClientContext context = new ClientContext(webUrl))
{
Web web = context.Web;
context.Load(web.Lists);
await Task.Run(() => clientContext.ExecuteQuery());
return web.Lists.Count;
}
}
それは意味を成さないし、それは助けていますか?私はそれを理解しているので、私はクエリを実行するための新しいスレッド( "オーバーヘッド")を作成/必要としますが、少なくとも要求スレッドは空いている/別の要求の準備ができています。
しかし、それは価値があり、このようにするべきですか?
もしそうなら: マイクロソフトが「非同期」メソッドを提供していないのは奇妙ではないのですか、それとも気にしませんでしたか?
編集: Task.Run
をコメント内の示唆通りに更新しました。
'Task.Factory.StartNew'を使用せず、' Task.Run'を使用します。 * SharePoint *を呼び出す場合、コンテキストにはExecuteQueryAsyncメソッドがあり、これを使用してタスクを返すことができます。 –
私のCSOMライブラリに 'ExecuteQueryAsync'がありません。 –
は 'nuget経由で' Microsoft.SharePointOnline.CSOM、16.1.6216'にアップアップされましたが、そこには 'ExecuteQueryAsync'はありません。 –