我知道您应该只对非“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'。 –