c# – 更改我的服务器端WebAPI以获得async / await的好处
发布时间:2020-12-16 02:01:58 所属栏目:百科 来源:网络整理
导读:试图了解服务器端的异步/等待使用.我的理解是它只在释放线程时才有用. 如果我有: [HttpGet]public async TaskIEnumerableMyObject Get(){ return await TaskIEnumerableMyObject.Run(() = DoThingsAndGetResults());}IEnumerableMyObject DoThingsAndGetRes
|
试图了解服务器端的异步/等待使用.我的理解是它只在释放线程时才有用.
如果我有: [HttpGet]
public async Task<IEnumerable<MyObject>> Get()
{
return await Task<IEnumerable<MyObject>>.Run(() => DoThingsAndGetResults());
}
IEnumerable<MyObject> DoThingsAndGetResults()
{
// ...Do some CPU computations here...
IEnumerable<MyObject> result = myDb.table.Select().ToList(); // entity framework
// ...Do some CPU computations here...
return result;
}
线程会被释放吗?在这种情况下Async / Await是无用的吗?从异步/等待中获益的唯一方法是,如果我做了一些更大的更改并执行此操作: [HttpGet]
public async Task<IEnumerable<MyObject>> Get()
{
return await DoThingsAndGetResultsAsync();
}
async IEnumerable<MyObject> DoThingsAndGetResultsAsync()
{
// ...Do some CPU computations here...
IEnumerable<MyObject> result = await myDb.table.Select().ToListAsync(); // entity framework
// ...Do some CPU computations here...
return result;
}
解决方法
如果你想要实现的是释放线程,第二个例子更好.第一个在整个操作中保持一个线程.
说明 async-await所做的就是简单地帮助您编写异步运行但“看起来”同步的代码. 异步代码有两个原因: >卸货.主要用于GUI线程或其他“更重要”的线程“.(在等待CPU操作完成时释放线程). 不出所料,原因与你的例子相符. 在第一个示例中,您在另一个线程上运行DoThingsAndGetResults(使用Task.Run)并等待它以异步方式完成.第一个线程正在释放,但第二个线程没有. 在第二个中,您一次只使用1个线程,并在等待IO(实体框架)时释放它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
