我知道您應該只對非「CPU密集型」的東西使用異步,例如,文件寫入,網絡電話等,因此我也知道把每種方法都包裝進Task.Run
或類似的東西是沒有意義的。將非異步方法(可以進行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'。 –