async jquery调用异步mvc控制器

时间:2015-04-15 07:01:14

标签: c# asp.net-mvc asynchronous

如何让我的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自动完成的吗?

编辑: enter image description here

3 个答案:

答案 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";
}

enter image description here

答案 2 :(得分:0)

如何在MVC控制器中创建两个任务?

var t1 = new Task(() => { /*The slow task 1 */ });
var t2 = new Task(() => { /*The slow task 2 */});

Task.WaitAll(t1,t2);