我知道你应该只在不“占用CPU”的情况下使用async,例如文件写入、Web调用等。因此我也知道把每个方法都包装到
Task.Run
或类似的东西中是没有意义的。
然而,当我知道一个方法进行了Web调用,但它没有提供异步接口时,我该怎么办呢?在这种情况下,将其包装起来是否值得呢?
具体例子:
我正在我的WebApi应用程序(服务器)中使用CSOM(Client SharePoint Object Model)并想要获取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;
}
}
这样做有意义吗?从我的理解来看,我只需要创建 / 需要一个新线程来执行查询("overhead"),但至少请求线程将会空闲 / 准备好处理另一个请求(这是很好的)。
但这样做是否值得和应该这样做呢?
如果是这样:
那么 Microsoft 为什么不提供 "async" 方法呢?或者他们只是不关心它?
编辑:
按照评论中的建议更新为使用 Task.Run
。
Task.Factory.StartNew
,而是使用Task.Run
。至于调用SharePoint,上下文具有ExecuteQueryAsync
方法,可以适应返回任务。 - Panagiotis KanavosMicrosoft.SharePointOnline.CSOM
,人们会认为这是最新的、最新的 CSOM……但我找不到你在那里提到的这个 async 方法。 - OschtärEi