首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在web api控制器(.net核心)中使用异步/等待或任务

在web api控制器(.net核心)中使用异步/等待或任务
EN

Stack Overflow用户
提问于 2017-01-31 16:43:55
回答 1查看 111.4K关注 0票数 69

我有一个.net核心应用程序接口,它有一个控制器,可以构建一个要返回的聚合对象。它创建的对象由来自对服务类的3次方法调用的数据组成。这些都是相互独立的,并且可以相互隔离地运行。目前,我正在使用任务来提高这个控制器的性能。当前的版本看起来像这样...

代码语言:javascript
复制
[HttpGet]
public IActionResult myControllerAction()
{      
    var data1 = new sometype1();
    var data2 = new sometype2();
    var data3 = new List<sometype3>();

    var t1 = new Task(() => { data1 = service.getdata1(); });
    t1.Start();

    var t2 = new Task(() => { data2 = service.getdata2(); });
    t2.Start();

    var t3 = new Task(() => { data3 = service.getdata2(); });
    t3.Start();

    Task.WaitAll(t1, t2, t3);

    var data = new returnObject
    {
         d1 = data1,
         d2 = data2,
         d2 = data3
    };

    return Ok(data);
}

这很有效,但是我想知道使用tasks是否是最好的解决方案?使用async/await会不会是一个更好的想法和更容易被接受的方式?

例如,控制器是否应该标记为async,并在每次调用服务方法时放置一个等待?

EN

回答 1

Stack Overflow用户

发布于 2017-01-31 17:05:09

据我所知,你想让它并行执行,所以我不认为你的代码有任何问题。正如Gabriel提到的,你可以等待任务的完成。

代码语言:javascript
复制
[HttpGet]
public async Task<IActionResult> myControllerAction()
{      
  var data1 = new sometype1();
  var data2 = new sometype2();
  var data3 = new List<sometype3>();

  var t1 = Task.Run(() => { data1 = service.getdata1(); });
  var t2 = Task.Run(() => { data2 = service.getdata2(); });
  var t3 = Task.Run(() => { data3 = service.getdata3(); });

  await Task.WhenAll(t1, t2, t3); // otherwise a thread will be blocked here

  var data = new returnObject
  {
      d1 = data1,
      d2 = data2,
      d2 = data3
  };

 return Ok(data);
}

您还可以使用任务的结果来保存一些代码行,并使代码总体上“更好”(参见注释):

代码语言:javascript
复制
[HttpGet]
public async Task<IActionResult> myControllerAction()
{      
  var t1 = Task.Run(() => service.getdata1() );
  var t2 = Task.Run(() => service.getdata2() );
  var t3 = Task.Run(() => service.getdata3() );

  await Task.WhenAll(t1, t2, t3); // otherwise a thread will be blocked here

  var data = new returnObject
  {
      d1 = t1.Result,
      d2 = t2.Result,
      d2 = t3.Result
  };

 return Ok(data);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41953102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档