相关疑难解决方法(0)

在ASP.NET Core中相关的ConfigureAwait(false)?

我在GitHub上偶然发现了一个问题(https://github.com/HTBox/allReady/issues/1313),在那里他们讨论了如何ConfigureAwait(false)ASP.NET核心中删除代码

呼叫ConfigureAwait(false)是多余的,什么都不做

我能找到的最好的答案是一个"旁注"(来自Stephen Cleary,https: //stackoverflow.com/a/40220190/2805831 )

ASP.NET Core不再具有"上下文"

那么,ASP.NET Core中ConfigureAwait(false)真的没必要(即使使用完整的.Net Framework)?在某些情况下,它在性能方面是否有任何实际的好处,或者在结果/语义上有所不同?

编辑:如果我将其作为控制台应用程序托管或在IIS中,它在这方面有所不同吗?

.net async-await asp.net-core

70
推荐指数
2
解决办法
2万
查看次数

在WebApi或MVC控制器中使用ConfigureAwait(false)有任何危险吗?

说我有两个场景:

1)WebApi控制器

    [System.Web.Http.HttpPost]
    [System.Web.Http.AllowAnonymous]
    [Route("api/registerMobile")]
    public async Task<HttpResponseMessage> RegisterMobile(RegisterModel model)
    {
        var registerResponse = await AuthUtilities.RegisterUserAsync(model, _userService, User);
        if (registerResponse.Success) {
            var response = await _userService.GetAuthViewModelAsync(model.Username, User);
            return Request.CreateResponse(HttpStatusCode.OK, new ApiResponseDto() { Success = true, Data = response });
        }
        else {
            return Request.CreateResponse(HttpStatusCode.OK, registerResponse);
        }

    }
Run Code Online (Sandbox Code Playgroud)

2)MVC控制器

    [Route("public")]
    public async Task<ActionResult> Public()
    {
        if (User.Identity.IsAuthenticated)
        {
            var model = await _userService.GetAuthViewModelAsync(User.Identity.Name);
            return View("~/Views/Home/Index.cshtml", model);
        }
        else
        {
            var model = await _userService.GetAuthViewModelAsync(null);
            return View("~/Views/Home/Index.cshtml", model);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我一直在阅读我应该使用的时间ConfigureAwait …

.net c# asp.net-mvc asynchronous asp.net-web-api

43
推荐指数
1
解决办法
1万
查看次数

为什么总是推荐使用 await 在每一行上写 ConfigureAwait(false) ,我真的需要它吗?

问题不在于 ConfigureAwait 做什么。但更确切地说,为什么我到处都能看到类似的东西

一般来说,是的。除非该方法需要其上下文,否则应为每个等待使用 ConfigureAwait(false)。

即他们建议我应该写

await Method1().ConfigureAwait(false);
await Method2().ConfigureAwait(false);
// Do something else
// ...
await Method3().ConfigureAwait(false);
await Method4().ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,只在一开始就重置上下文不会更清楚,就像

await Task.Yield().ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)

它保证下面的代码将在没有同步上下文的情况下执行,不是吗?

即我读到如果该方法立即返回,则写一次 ConfigureAwait 可能不起作用。对我来说,显而易见的解决方案看起来像调用 ConfigureAwait(false) 肯定不会立即返回的东西,Task.Yield 是什么,对吧?

另外我知道 Task.Yield 不再包含 ConfigureAwait(不知道为什么,因为我知道它以前曾经有它),但是查看 Task.Yield 代码很容易编写自己的方法除了用空的同步上下文调用延续之外,什么都不做。

对我来说,阅读似乎要容易得多,尤其是当你写一次的时候写

await TaskUtility.ResetSyncContext();
Run Code Online (Sandbox Code Playgroud)

而不是在每一行上写 ConfigureAwait。

这会起作用(Task.Yield().ConfigureAwait(false) 或类似的自定义方法)还是我错过了什么?

c# async-await .net-core

4
推荐指数
1
解决办法
875
查看次数