异步 jquery 调用异步 mvc 控制器

async jquery call to async mvc controller

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

编辑:

您没有在方法 GetSlowstring 中调用 await,因此它会同步阻塞 Thread.Sleep(10000); 的线程。出于测试目的,您可以尝试将这行代码替换为 Task.Delay 方法(参见 MSDN article for this method):

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

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

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

Task.WaitAll(t1,t2);

根据 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/