【发布时间】:2019-01-22 06:07:51
【问题描述】:
我有一个需要 new Thread() 的应用程序(http web 负载测试应用程序),而 HttpClient 只有异步方法,那么我如何同步运行操作
ps:我尝试使用完整的Task,但它使用的线程数很低(仅 30 个线程),
所以我想试试Thread 看看它是否可以更快。
.GetAwaiter().GetResult() 会花费 2 个线程(100 个线程变成 200 个线程)吗?
以前我用过
for(var i = 0; i< 200;i++)
{
Task.Run(async ()=>
{
while(thereStillHaveRequestToMake)
{
await httpclient.SendAsync() // some thing like this
}
});
}
// the prolem is there are only 30-40 Thread in use (From TaskManager)
所以我想直接切换使用Thread
for(var i = 0; i< 200;i++)
{
new Thread(()=>
{
while(thereStillHaveRequestToMake)
{
httpclient.SendAsync().GetAwaiter.GetResult()
}
});
}
【问题讨论】:
-
您的假设是错误的,
.GetAwaiter().GetResult()不会花费任何线程,如果编写正确,异步 io 调用将不会使用任何线程。如果您正在编写负载测试器,我建议您使用 DataFlow 之类的东西,它可以让您对线程进行更好的细粒度控制,并且可以很好地与异步配合使用。但是这一切都很难说,因为我们没有看到您尝试使用的代码.. 虽然这不是 XY 问题的经典定义,但实际上您想出于错误的原因做错误的事情是 XY -
@TheGeneral 我今天读到了stackoverflow.com/questions/34151179/…,我无法理解“
.GetAwaiter().GetResult()不会花费任何线程,如果编写正确,异步 io 调用将不会使用任何线程。”,我认为它会使用附加线程来完成await关键字之后的动作,因为当前线程被阻塞直到整个Task完成,除非Task是第一个真正的异步Task(不要使用async,await关键字) -
无法回答这个问题的原因是您没有给出原因或示例说明为什么此代码必须同步运行。否则它只是 How to call asynchronous method from synchronous method in C#? 的副本。
-
@John 你是命名不正确。 You want more requests, it doesn't matter how you produce them。说线程与请求的数量没有任何关系。
标签: c# multithreading asynchronous