Tre*_*vor 11 .net c# asynchronous task-parallel-library async-await
我有一个TPL任务,做两件事.首先,它调用Web服务.其次,它将一些数据插入数据库.我一次启动多达20个任务一次又一次地做同样的事情.他们全天所做的就是调用Web服务并将数据插入数据库.
我对.NET中的TPL很新.我已经完成了一些后台工作进程和异步Web服务.
Web服务调用和数据库插入都是在运行任务的线程内阻塞调用.
据我所知,在使用Tasks时,.NET会为您管理一个线程池.是?
如果我使用async和await()进行服务调用和数据库调用而不是使它们阻塞调用,那么线程池是否可以使用更多的线程?
我的理论(我不确定我为什么这么认为)是线程在等待阻塞Web服务时忙于什么都不做,并且无法将其资源临时返回到池中.但是我想知道任务是否在等待异步调用来完成主要任务线程是否能够在等待时切换到让其他东西处理.
我的理论是对的吗?或者我在做什么?
我正在使用c#和.NET 4.0,但如果需要,我可以使用4.5.
如果我使用async和await()进行服务调用和数据库调用而不是使它们阻塞调用,那么线程池是否可以使用更多的线程?
这取决于"使用async-await"的含义.
当您Task.Run在幕后使用时,Task该类使用线程ThreadPool来卸载工作ThreadPool.
如果您的服务没有暴露真正的异步api并且您使用Task.Run对工作进行排队,那么无论使用何种用途,您仍将阻止线程池线程执行IO绑定工作async-await.在你的问题中,你声明两个调用都是阻塞调用,在这种情况下答案是否定的,用于阻止调用的线程池线程仍然会被阻止.
如果您的服务和数据库调用是真正的异步API(不使用任何额外的线程来完成其工作),您可以利用async-await,就像您await在其中一个调用上一样(并且您不需要使用Task.与它们一起运行),当前线程将控制权返回给调用者,并且可以同时用于执行更多工作.如果是这种情况,那么是的.
我的理论(我不确定我为什么这么认为)是线程在等待阻塞Web服务时忙于什么都不做,并且无法将其资源临时返回到池中.但是我想知道任务是否在等待异步调用来完成主要任务线程是否能够在等待时切换到让其他东西处理.
你的理论是正确的.如果排队的线程池工作的主要工作是发出IO绑定请求,那么它的大部分时间花费只是阻塞直到请求完成.
当你awaita Task,控制权返回给调用者.让我们假设你的服务电话是一个REST调用,您可以使用HttpClient它公开真正的无螺纹消费异步方法,例如GetAsync,PostAsync和当你await这些呼叫,您的电话线被释放的同时做更多的工作.
| 归档时间: |
|
| 查看次数: |
2198 次 |
| 最近记录: |