通过await关键字返回任务和不使用await关键字返回任务之间的主要区别是什么?

凯末尔·古尔特金

我正在包装AspNet.Identity。但是我对TPL感到有些困惑。

第一个例子:

    public virtual async Task<IdentityResult> RemovePasswordAsync(string userId)
    {
        var user = _store.FindByIdAsync(userId).Result;
        if (user == null)
            throw new InstanceNotFoundException("user");

        user.PasswordHash = String.Empty;
        user.SecurityStamp = String.Empty;
        return await UpdateAsync(user);
    }

    public virtual async Task<IdentityResult> UpdateAsync(TUser user)
    {
        await _store.UpdateAsync(user);
        return new IdentityResult();
    }

第二个例子:

    public virtual Task<IdentityResult> RemovePasswordAsync(string userId)
    {
        var user = _store.FindByIdAsync(userId).Result;
        if (user == null)
            throw new InstanceNotFoundException("user");

        user.PasswordHash = String.Empty;
        user.SecurityStamp = String.Empty;
        return UpdateAsync(user);
    }

    public virtual async Task<IdentityResult> UpdateAsync(TUser user)
    {
        await _store.UpdateAsync(user);
        return new IdentityResult();
    }

客户会这样称呼:

    result = await _userManager.RemovePasswordAsync(user.Id);

我的第一个问题是:

当客户端调用第二种方法时,工作将从IO线程转移到线程池线程。RemovePasswordAsync被调用时,它调用UpdateAsync具有await关键字的关键字。那么,此时该线程池线程是否已卸载到另一个线程池线程?还是TPL继续使用相同的线程?

我的第二个问题是;构造此async方法的第一个实现和第二个实现之间的主要区别是什么

编辑:

这是UserStore该类的更新方法_store.UpdateAsync(user)

    public Task UpdateAsync(TUser user)
    {
        if (user == null)
            throw new ArgumentNullException("user");

        return _userService.UpdateAsync(user);
    }

这是UserService该类的更新方法

    public Task UpdateAsync(TUser user)
    {
        return Task.Factory.StartNew(() => Update(user));
    }
dcastro

我会回答你的第一个问题。

您误会了异步/等待的工作方式。

一种async方法将同步运行,至少直到它遇到第一个await声明。到达时await,有两个选择:

  • 如果可等待的对象(例如Task)已经完成,则执行将继续执行当前上下文(即UI线程或ASP.NET请求的上下文)。
  • 如果awaitable尚未完成,则它将包装方法的其余主体,并计划在任务完成时在当前上下文(即UI线程)(*)上执行该主体。

通过此定义,您的整个代码将在相同的ASP.NET请求的上下文中运行。

_store.UpdateAsync但是可能会生成ThreadPool线程(例如,使用Task.Run)。

更新

根据您更新的答案,Update(user)将在ThreadPool线程上运行。其他所有内容将在当前上下文中运行。


(*)如果没有同步上下文(即控制台应用程序),则该方法主体的其余部分将安排在ThreadPool线程上运行

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过await关键字返回任务和不使用await关键字返回任务之间的主要区别是什么?

来自分类Dev

在CPU绑定的任务上使用await关键字与Task.Wait()方法之间有什么区别?

来自分类Dev

线程,任务和异步/等待关键字之间的区别

来自分类Dev

立即执行的功能和使用关键字new的区别是什么?

来自分类Dev

使用关键字“ and”和“或”的返回语句

来自分类Dev

使用和不使用`New`关键字定义数组之间有什么区别?

来自分类Dev

Future,async,await 关键字是什么意思?

来自分类Dev

如何使用await关键字?

来自分类Dev

当不使用async / await关键字时,为什么异步单元测试失败?

来自分类Dev

递归和返回关键字

来自分类Dev

使用“new”关键字和不使用它有什么区别?

来自分类Dev

在创建新的对象/类时,闭包可以使用new关键字,例如,区别是什么

来自分类Dev

使用指针和ref关键字引用值之间有什么区别

来自分类Dev

关键字,保留字和内置关键字之间的区别?

来自分类Dev

关键字,保留字和内置关键字之间的区别?

来自分类Dev

新的python async和await关键字

来自分类Dev

在Dapper中使用Async Await关键字

来自分类Dev

使用await关键字的多个API调用的性能下降

来自分类Dev

在哪里使用await关键字-C#

来自分类Dev

是否在不使用async await关键字的情况下等待promise的价值?

来自分类Dev

d3js-如何使用`this`关键字或替代关键字是什么?

来自分类Dev

d3js-如何使用`this`关键字或替代关键字是什么?

来自分类Dev

Swift中'is'和'as'关键字之间的区别

来自分类Dev

Kotlin中Hard和Soft关键字之间的区别

来自分类Dev

在SQL Server上使用或不使用CONSTRAINT关键字之间的区别

来自分类Dev

volatile和static关键字有什么区别?

来自分类Dev

“数据”和“类型”关键字有什么区别?

来自分类Dev

volatile和static关键字有什么区别?

来自分类Dev

语句和关键字有什么区别?

Related 相关文章

  1. 1

    通过await关键字返回任务和不使用await关键字返回任务之间的主要区别是什么?

  2. 2

    在CPU绑定的任务上使用await关键字与Task.Wait()方法之间有什么区别?

  3. 3

    线程,任务和异步/等待关键字之间的区别

  4. 4

    立即执行的功能和使用关键字new的区别是什么?

  5. 5

    使用关键字“ and”和“或”的返回语句

  6. 6

    使用和不使用`New`关键字定义数组之间有什么区别?

  7. 7

    Future,async,await 关键字是什么意思?

  8. 8

    如何使用await关键字?

  9. 9

    当不使用async / await关键字时,为什么异步单元测试失败?

  10. 10

    递归和返回关键字

  11. 11

    使用“new”关键字和不使用它有什么区别?

  12. 12

    在创建新的对象/类时,闭包可以使用new关键字,例如,区别是什么

  13. 13

    使用指针和ref关键字引用值之间有什么区别

  14. 14

    关键字,保留字和内置关键字之间的区别?

  15. 15

    关键字,保留字和内置关键字之间的区别?

  16. 16

    新的python async和await关键字

  17. 17

    在Dapper中使用Async Await关键字

  18. 18

    使用await关键字的多个API调用的性能下降

  19. 19

    在哪里使用await关键字-C#

  20. 20

    是否在不使用async await关键字的情况下等待promise的价值?

  21. 21

    d3js-如何使用`this`关键字或替代关键字是什么?

  22. 22

    d3js-如何使用`this`关键字或替代关键字是什么?

  23. 23

    Swift中'is'和'as'关键字之间的区别

  24. 24

    Kotlin中Hard和Soft关键字之间的区别

  25. 25

    在SQL Server上使用或不使用CONSTRAINT关键字之间的区别

  26. 26

    volatile和static关键字有什么区别?

  27. 27

    “数据”和“类型”关键字有什么区别?

  28. 28

    volatile和static关键字有什么区别?

  29. 29

    语句和关键字有什么区别?

热门标签

归档