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(实体框架)时释放它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |