gpt4 book ai didi

c# - 异步调用在 asp.net core 中无效

转载 作者:太空宇宙 更新时间:2023-11-03 15:00:03 32 4
gpt4 key购买 nike

我想测试 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();
}
}

然后我在 Controller 中写了一些简单的代码来调用一个异步方法。在索引操作中,我在 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();
}

并在 Controller 中添加两个简单的查询方法,一个是简单的,另一个是异步的。两个查询都需要 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';");
}
}

然后我添加同步、异步、并行测试三个 Action

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 Load Tester 测试我的场景使用以下配置

Execution Time: 60 seconds and Number of Thread that sends the requests: 10

这张图片是我的测试结果,显示了成功请求的数量、失败请求的数量以及每次操作请求的平均时间。

result of test

关于c# - 异步调用在 asp.net core 中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46661499/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com