加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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操作完成时释放线程).
>可扩展性.主要用于服务器端以减少资源使用. (在等待IO完成时释放线程).

不出所料,原因与你的例子相符.

在第一个示例中,您在另一个线程上运行DoThingsAndGetResults(使用Task.Run)并等待它以异步方式完成.第一个线程正在释放,但第二个线程没有.

在第二个中,您一次只使用1个线程,并在等待IO(实体框架)时释放它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读