gpt4 book ai didi

c# - Rest api 中的 Thread.sleep 与 Task.delay

转载 作者:行者123 更新时间:2023-12-03 05:41:49 27 4
gpt4 key购买 nike

我正在比较 Thread.sleep 和 task.delay。从数据库检查作业完成状态。该作业将由其他一些 Azure 组件执行。

为了测试它,创建了具有同步和异步模式的小型 api。

使用异步的httprest api:

public async Task<HttpResponseMessage> Post()
{
await Task.Delay(200);
return await Task.FromResult(new HttpResponseMessage());}

使用同步的http Rest API:

public HttpResponseMessage Post()
{
Thread.sleep(200);
return new HttpResponseMessage();}

有趣的是。同步调用的结果很好。使用 Apache jmeter 对 100 个用户进行了 5 次迭代尝试。

Sync result.: min : 414 ms average : 8464 ms

Async result : min 1756 ms average : 10044 ms

为什么 Thread.sleep 比 Async 更好。这是任务创建的开销吗?难道我不能得到比这两个更好的结果吗?

最佳答案

异步代码的目的不是提高单个操作的性能。事实上,正如您所看到的,有时情况恰恰相反。

异步代码的要点是不锁定当前线程。好处取决于应用程序的类型:

桌面应用(我知道这不适用于您,但值得一提)

在桌面应用程序中,您不会卡住 UI 线程。这样,当您等待某些 I/O 操作的响应时,您的 UI 仍然可以响应用户。

因此,虽然单个操作可能需要稍微更长的时间,但用户不会因为 UI 没有卡住而感到沮丧。

网络应用

在 Web 应用程序中,它会释放当前线程以处理下一个传入的请求。ASP.NET 的可用线程数量有限,因此如果您的流量足够繁忙,请求可能必须等待在被处理之前。异步代码可以帮助您避免这种情况。

例如,同步 I/O 操作将锁定当前线程(如 Thread.Sleep)。在操作完成之前,线程不能执行任何其他操作。

如果您使用异步代码(例如 Task.Delay),那么一旦异步操作开始,线程就会返回到线程池,并可用于在等待时处理另一个请求。

因此,虽然单个操作可能需要稍微更长的时间,但它允许您的应用程序处理更大的负载。

微软关于这方面的文档实际上非常出色:Asynchronous programming with async and await

关于c# - Rest api 中的 Thread.sleep 与 Task.delay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58208120/

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