c# - await 运算符在 ASP.NET 上的行为与在 ASP.NET CORE 上的行为不同吗?

标签 c# asp.net-mvc async-await asp.net-core-2.0 asp.net-4.6

在 ASP.NET CORE 2.0 中我有这样的行为: 我从浏览器发送两个 AJAX 请求,第一个请求到一个操作(action1,这是一个异步操作),第二个请求到另一个操作(action2)。 当服务器正在处理第一个请求时,第二个请求排队,然后当第一个请求将“等待”指令放入操作 1 时,操作 2 立即开始处理第二个请求并且第一个请求进入队列。这是预期的行为,但是如果我在 ASP.NET 4.6 中尝试这样做,我会出现以下行为: 当第一个请求命中“await”指令时,第二个请求保持排队,必须等到第一个操作完成整个处理,第二个操作才能接收第二个请求。

这是我的服务器端代码

  [HttpPost]
    public async Task<JsonResult> LongRunningAction(HttpPostedFileBase file)
    {
        for (int i = 0; i < 100; i++)
        {                
            await Task.Delay(300);
        }
        return Json("finish");
    }

    [HttpPost]
    public ActionResult ParallelAction()
    {
        return this.Content("result");
    }

这是我的js:

startParallelRequest();
startLongRunningRequest()

function startLongRunningRequest(){
    $.ajax(
        {
            url: "/mycontroller/LongRunningAction",
            data: null,
            processData: false,
            contentType: false,
            type: "POST",
            success: function () {
                stopParallelAction();
            }
        }
    )
} 

var intervalId;

function startParallelRequest() {
    intervalId = setInterval(
        function () {
            $.ajax(
                {
                    url: "/mycontroller/ParallelAction",
                    data: null,
                    processData: false,
                    contentType: false,
                    type: "POST",
                    success: function () {
                    }
                }
            );
        },
        1000
    );
}

function stopParallelRequest() {
    clearInterval(intervalId);
}

我想得到的是循环每次迭代中并行操作的响应。 此行为在 ASP.NET 2.0 项目中运行良好,但在 ASP.NET 4.6 中则不然。 提前致谢。

最佳答案

awaitasync 关键字的行为相同。但是这些关键字的行为取决于 SynchronizationContext。区别在于:ASP.NET Core has no synchronization context .

在所有情况下,await 都会将控制权返回给调用者并向SynchronizationContext.Current。在 ASP.NET(框架)中,这意味着将一次提取一个延续,从不并行;在 .NET Core 中,它们可以并行执行。

这意味着某些行为会有所不同。例如,在 .NET 框架中,您可以 easily deadlock yourself ,但许多相同的事情不会在 ASP.NET Core 中死锁,因为没有对主“线程”的争用(实际上,线程可以由于 threading agility 而切换,但本质上它是单线程的)。另一方面,.NET Framework 中的“线程安全”代码可能会导致 .NET Core 中的并发问题。顺便说一句,SynchronizationContext 在 Console 和 WinForms 应用程序中也不同。

在使用 async 和 await 时理解 SynchronizationContext 非常重要,这将取决于代码的运行方式和位置。

另见 this question .

关于c# - await 运算符在 ASP.NET 上的行为与在 ASP.NET CORE 上的行为不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49822001/

相关文章:

asp.net-mvc - 在 ASP.NET Identity 2.0 中的 AspNetUsers 表中更改电子邮件或密码

ios - 如何在 Swift 中成功实现 async 和 await,以及最好的使用方法是什么

c# - ActionBlock<T> 与 Task.WhenAll

c# - 如何在异步方法中实现 InvokeRequired UI 模式?

c# - 如何覆盖第三方应用程序上的关闭按钮,使其最小化?

c# - IEnumerable<T>.Union(IEnumerable<T>) 覆盖内容而不是合并

asp.net - 如何在 GetVaryByCustomString 中访问 asp.net mvc 路由值?

asp.net-mvc - 从 ASP.NET MVC 1 迁移到 ASP.NET MVC 2 后的 PathTooLongException

javascript - NodeJS "readline"模块不输出提示

c# - 为什么这个差距会出现在我的 ListView 中?