Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

async jquery call to async mvc controller

How do i get my jquery methods to call my mvc controller and my mvc controller to do 2 things at the same time?

The jquery code is doint fine. It just calls the methods and keep on going as i want it to.

 $(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");
        }
    });

My C# code on the other hand is not doing two things at a time:

    [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);
    }

The combined call should take just a little more then 10 seconds if it is done correctly but now it takes the double.

Do i need to create a new thread for the calls? Or is this done automatically by the apppool?

EDIT: enter image description here

like image 222
Daniel Gustafsson Avatar asked Apr 15 '15 07:04

Daniel Gustafsson


2 Answers

Based on image of Chrome console, problem is in SessionState. By default, when application uses SessionState, ASP framework processes requests from single user serially (to prevent session variables from potential corruption).

For cases, when you want to enable parallel processing of requests for single user (and do not need to update session) you can use SessionState attribute on controller.

 [SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]

More details can be found for example in here: http://www.stefanprodan.com/2012/02/parallel-processing-of-concurrent-ajax-requests-in-asp-net-mvc/

like image 128
Marian Polacek Avatar answered Nov 13 '22 03:11

Marian Polacek


You are not calling await in your method GetSlowstring, so it synchronously blocks the thread with Thread.Sleep(10000);. For testing purposes, you can try to replace this line of code with Task.Delay method (see MSDN article for this method):

public async Task<string> GetSlowstring()
{
    await Task.Delay(10000);
    return "hejsan";
}

enter image description here

like image 42
Eadel Avatar answered Nov 13 '22 02:11

Eadel