REST API中的Thread.sleep与Task.delay

时间:2019-10-02 19:24:09

标签: c# .net multithreading azure async-await

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

要进行测试,请创建具有同步和异步模式的小型api。

使用rest的http rest api:

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

使用rest的http rest api:

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

有趣的是。结果对于Sync通话是不错的。使用Apache jmeter对100个用户进行了5次迭代尝试。

  

同步结果。:最小:414毫秒,平均:8464毫秒

     

异步结果:至少1756 ms,平均:10044 ms

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

1 个答案:

答案 0 :(得分:0)

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

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

台式机应用(我知道这不适用于您,但值得一提)

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

因此,尽管单个操作可能花费的时间稍长些,但用户不会因为UI未被冻结而感到沮丧。

网络应用

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

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

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

因此,尽管单个操作可能花费的时间稍长些,但它使您的应用程序可以处理更大的负载。

Microsoft在此方面的文档实际上非常出色:Asynchronous programming with async and await

相关问题