如何让我的jquery方法调用我的mvc控制器和我的mvc控制器同时做两件事?
jquery代码很好。它只是调用方法并继续按我的意愿继续运行。
$(document).ready(function () {
console.log("1");
getADsad();
console.log("2");
lala();
console.log("3");
});
function getADsad() {
$.ajax({
url: '/Configurator/Configure/Hello1',
type: 'POST',
dataType: 'json',
success: function (data) {
console.log(data + "hello1");
}
});
}
function lala() {
$.ajax({
url: '/Configurator/Configure/Hello2',
type: 'POST',
dataType: 'json',
success: function (data) {
console.log(data + "hello2");
}
});
另一方面,我的C#代码一次不做两件事:
[HttpPost]
public async Task<LoginViewModel> Hello1()
{
var str = await GetSlowstring();
return str;
}
[HttpPost]
public async Task<LoginViewModel> Hello2()
{
var str = await GetSlowstring();
return str;
}
public async Task<LoginViewModel> GetSlowstring()
{
await Task.Delay(10000);
LoginViewModel login = new LoginViewModel();
login.UserName = "HejsN";
return await Task.FromResult(login);
}
如果正确完成,组合调用应该只需要10秒钟,但现在需要加倍。
我是否需要为通话创建新线程?或者这是由apppool自动完成的吗?
编辑:
答案 0 :(得分:13)
根据Chrome控制台的图片,问题出在SessionState中。默认情况下,当应用程序使用SessionState时,ASP框架会串行处理来自单个用户的请求(以防止会话变量发生潜在的损坏)。
对于某些情况,如果要为单个用户启用并行处理请求(并且不需要更新会话),则可以在控制器上使用SessionState
属性。
[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
例如,可以在此处找到更多详细信息:http://www.stefanprodan.com/2012/02/parallel-processing-of-concurrent-ajax-requests-in-asp-net-mvc/
答案 1 :(得分:1)
您没有在方法await
中调用GetSlowstring
,因此它会同步阻止线程Thread.Sleep(10000);
。出于测试目的,您可以尝试使用Task.Delay
方法替换此行代码(请参阅MSDN article for this method):
public async Task<string> GetSlowstring()
{
await Task.Delay(10000);
return "hejsan";
}
答案 2 :(得分:0)
如何在MVC控制器中创建两个任务?
var t1 = new Task(() => { /*The slow task 1 */ });
var t2 = new Task(() => { /*The slow task 2 */});
Task.WaitAll(t1,t2);