繁体   English   中英

在asp.net核心中异步调用无效

[英]async call not effectiveness in asp.net core

我想测试ASP.NET Core 2.0中异步请求与同步请求的有效性。 为此,我将Kestrel / Libuv ThreadCount为1,以强制其仅对所有请求使用单个线程。

public class Program
{
    public static void Main(string[] args)
    {
        WebHost.CreateDefaultBuilder(args)
            .UseLibuv(options =>
            {
                options.ThreadCount = 1;
            })
            .UseStartup<Startup>()
            .Build()
            .Run();
    }
}

然后,我在控制器中编写一些简单的代码来调用异步方法。 在索引操作中,我在ViewBag中设置开始时间,然后异步调用Doing函数,最后在ViewBag中设置结束时间。

public class HomeController : Controller
{
    public async Task<IActionResult> Index()
    {
        ViewBag.Start = DateTime.Now;
        await Doing();
        ViewBag.Finish = DateTime.Now;

        return View();
    }

    public async Task Doing()
    {
        await Task.Delay(5000);
    }
}

查看代码是:

<div class="row">
    Start: @ViewBag.Start
</div>
<div class="row">
    Finish: @ViewBag.Finish
</div>

当我运行该应用程序并同时在两个浏览器中浏览到该页面时,我希望请求的开始时间大致相等。 但是,尝试此操作时,仅在第一个请求完成后才启动第二个请求。

例如,两个浏览器中的输出如下:

Start: 10/10/2017 10:16:36 AM
Finish: 10/10/2017 10:16:43 AM

Start: 10/10/2017 10:16:43 AM
Finish: 10/10/2017 10:16:50 AM

我的测试或概念有什么问题?

为了进行测试,我将以下代码添加到Program Main方法中,设置工作线程数为4。

public static void Main(string[] args)
{
    ThreadPool.SetMaxThreads(workerThreads: 4, completionPortThreads: 4);

    CreateWebHostBuilder(args).Build().Run();
}

并向控制器添加两种简单的查询方法,一种简单,另一种是异步的。 两次查询都需要2秒才能执行。 我使用Dapper进行运行查询。

private void Query()
{
    using (SqlConnection connection = new SqlConnection(_connectionString))
    {
        connection.Execute("WAITFOR DELAY '00:00:02';");
    }
}

private async Task QueryAsync()
{
    using (SqlConnection connection = new SqlConnection(_connectionString))
    {
        await connection.ExecuteAsync("WAITFOR DELAY '00:00:02';");
    }
}

然后添加三个动作以进行同步,异步,并行测试

public IActionResult Sync()
{
    Query();
    Query();

    return Ok();
}

public async Task<IActionResult> Async()
{
    await QueryAsync();
    await QueryAsync();

    return Ok();
}

public async Task<IActionResult> Parallel()
{
    var task1 = QueryAsync();
    var task2 = QueryAsync();

    await task1;
    await task2;

    return Ok();
}

我使用以下配置通过West Wind WebSurge负载测试器测试我的方案

执行时间:60秒,发送请求的线程数:10

此图像是我的测试结果,显示了成功请求的数量,失败请求的数量以及每个操作请求的平均时间。

测试结果

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM