我正在比较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更好。这是创建任务的开销吗?我不能获得比这两个更好的结果吗?
答案 0 :(得分:0)
异步代码的目的不是提高单个操作的性能。实际上,正如您所看到的,有时情况恰恰相反。
异步代码的重点是不锁定当前线程。好处取决于应用程序的类型:
台式机应用(我知道这不适用于您,但值得一提)
在桌面应用程序中,您不会冻结UI线程。这样,当您等待某些I / O操作的响应时,您的UI仍会响应用户。
因此,尽管单个操作可能花费的时间稍长些,但用户不会因为UI未被冻结而感到沮丧。
网络应用
在Web应用程序中,它释放当前线程以处理收到的下一个请求。ASP.NET使用的线程数量有限,因此,如果您的通信繁忙,请求可能必须等待。在处理之前。异步代码可帮助您避免这种情况。
例如,同步I / O操作将锁定当前线程(如Thread.Sleep
)。在操作完成之前,线程无法执行其他操作。
如果您使用异步代码(例如Task.Delay
),则一旦该异步操作开始,该线程将返回到线程池,并且可用于在等待时处理另一个请求。
因此,尽管单个操作可能花费的时间稍长些,但它使您的应用程序可以处理更大的负载。
Microsoft在此方面的文档实际上非常出色:Asynchronous programming with async and await