Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用HttpClient.PostAsync().Result是否仍会导致异步调度? 背景_C#_.net_Async Await_.net Core 3.1 - Fatal编程技术网

C# 调用HttpClient.PostAsync().Result是否仍会导致异步调度? 背景

C# 调用HttpClient.PostAsync().Result是否仍会导致异步调度? 背景,c#,.net,async-await,.net-core-3.1,C#,.net,Async Await,.net Core 3.1,我遇到了一个问题,即我正在以非常高的负载运行我的方法。负载太高,似乎导致wait的恢复出现调度问题 基本上,我是在调用wait-httpClient.PostAsync(url,content)。但是因为我打得太快(多线程),我最终在客户端上得到了很长的等待时间(服务仍然响应得很快)。从我所看到的,这个等待时间是由于在一个线程上安排了10秒的数千次恢复等待 问题: 如果我调用httpClient.PostAsync(url,content.Result)会不会仍然导致剩余代码按计划恢复,或者它真

我遇到了一个问题,即我正在以非常高的负载运行我的方法。负载太高,似乎导致
wait
的恢复出现调度问题

基本上,我是在调用wait-httpClient.PostAsync(url,content)。但是因为我打得太快(多线程),我最终在客户端上得到了很长的等待时间(服务仍然响应得很快)。从我所看到的,这个等待时间是由于在一个线程上安排了10秒的数千次恢复
等待

问题:
如果我调用
httpClient.PostAsync(url,content.Result)
会不会仍然导致剩余代码按计划恢复,或者它真的会同步执行?

TL;博士;-这样您将使用大约两倍的线程。经过多次讨论,您可能会找到比以下更好的解释(core和常规asp.net之间的唯一区别是core one不会死锁,因为它不再使用同步上下文,但在其他方面是相同的);这会阻止不希望被阻止的池线程-这可能会导致线程池starvation@MarcGravell-如果我使用
wait
我发现我的
Parallel.ForEach
循环远远超过我试图强制执行的
maxdegreeofpparallelism
。似乎当点击
wait
时,它会使并行循环认为线程已经完成,并启动另一个线程。这就是我如何压倒调度程序(和其他资源问题)的原因。我希望一次只运行10个请求,但当我使用wait时,我得到的远远不止这些。这让我得出了一个尴尬的结论:我希望它被阻止,这样我一次只能运行10次。@Vaccano是的,那是因为Parallel.ForEach正在使用Action,这意味着你的
async
lambda实际上是
async void
,这真的很糟糕(这意味着,除其他外,max dop不受尊重,但老实说:这只是冰山一角,原因是永远不要在事件处理程序之外使用
async void
)。讽刺的是,TPL(Parallel.ForEach)太长了,读不下去了,因为它是最早的,因为它早于它,或者说不是讽刺的:并行性和异步性是相关的,但是单独的概念听起来像是你想要的可以用这样的东西来解决:TL;DR;你会使用大约两倍多的线程。kely可以找到比以下更好的解释(core和常规asp.net之间的唯一区别是core one不会死锁,因为它不再使用同步上下文,但在其他方面是相同的).Accessing.Result是一个非常糟糕的主意;它会阻止一个不希望被阻止的池线程,这可能会导致线程池starvation@MarcGravell-如果我使用
await
我发现我的
并行.ForEach
循环远远超过了我试图强制执行的
MaxDegreeOfParallelism
wait
被点击时,它会使并行循环认为线程已经完成,并启动另一个线程。这就是我如何压倒调度程序(和其他资源问题)的原因。我希望一次只运行10个请求,但当我使用wait时,我得到的远远不止这些。这让我得出了一个尴尬的结论,我希望它被阻止,这样我一次只能运行10个请求。@Vaccano是的,这是因为Parallel.ForEach使用Action,这意味着
async
lambda实际上是
async void
,这真的很糟糕(这意味着,除其他外,max dop不受尊重,但老实说:这只是冰山一角,原因是永远不要在事件处理程序之外使用
async void
)。讽刺的是,TPL(Parallel.ForEach)与
async
/
await
的关系并不总是很好,因为它早于它们。或者可能并不具有讽刺意味:并行性和异步性是相关的,但不同的概念听起来像是你想要的东西可以通过以下方式解决: