在 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 中则不然。 提前致谢。
最佳答案
await
和 async
关键字的行为相同。但是这些关键字的行为取决于 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/