C# F#async在ASP.NET中使用ThreadPool
我想了解C# F#async在ASP.NET中使用ThreadPool,c#,asp.net,asynchronous,f#,async-await,C#,Asp.net,Asynchronous,F#,Async Await,我想了解threadpool在C与F#async中的用法。我在ASP.NET的控制器中有一个thisF#方法: 成员x.Get()= 异步的{ 让!res=loadCustomers() 返回res }|>Async.startask 我想知道,如果异步块中的所有内容都在ThreadPool上运行,我正在使用多少资源。 在C#with async/await中,它将在当前线程上运行,只是异步地等待IO完成。 startask函数的文档说“在线程池中执行一个计算”,所以我很惊讶我使用了比需要更多
threadpool
在C与F#async
中的用法。我在ASP.NET的控制器中有一个thisF#方法:
成员x.Get()=
异步的{
让!res=loadCustomers()
返回res
}|>Async.startask
我想知道,如果异步块中的所有内容都在ThreadPool
上运行,我正在使用多少资源。
在C#with async/await
中,它将在当前线程上运行,只是异步地等待IO完成。
startask
函数的文档说“在线程池中执行一个计算”
,所以我很惊讶我使用了比需要更多的资源。我发现startimimediate
在当前线程上开始工作,但只返回Unit
,我需要Task for asp.net
任务使用的资源比线程少,因为它们使用线程池,并且可能在同一线程的不同周期上运行。另一方面,线程为自己的目的使用一个单独的线程,因此随着时间的推移,将倾向于使用更多的资源,因为空周期不能用其他任务填充。通常Async
调用不涉及任何单独的线程。它在IO完成端口上工作,该端口是基于硬件的队列。使用一个单独的线程池肯定是在这里分配的额外资源,但在某些情况下,它是有用的,特别是当我们不想使用调用的同步上下文时thread@ShannonHolsinger也许问题的标题有误导性,我已经将线程更改为线程池。问题是C#async/await根本不使用线程池,它在IO完成端口上工作。但我发现关于F#的是异步块在threadpool上运行。当我真的让你失望的时候!这只是IO,线程没有被阻止,但它仍在使用线程池来处理异步块中的其他代码。@MrinalKamboj我关心的是,当我执行async.Start或async.startask时,它会将工作移动到线程池,并涉及多个线程。是的,当我允许时IO没有阻塞线程!但异步块中的其他代码移到了线程池中。@Michal长话短说,你们并没有做错什么。ASP.NET MVC可以识别async
签名,因此它知道在等待数据库时释放请求线程。这样可以减少使用的线程数。当数据库返回时,ASP.NET将重建原始同步上下文并继续。