好吧,我想保持简短和精确,我试图找到最有效的方法来完成大量的HttpWebRequests,但是如果我有一个任务列表,我会有点困惑并且我使用Task.WaitAll函数等待所有任务完成,是否过度使用列表中的任务(Action)也是异步任务?也许我可以在代码中更好地解释自己:
for (int i = 0; i < 50; i++)
{
taskList.Add(Task.Run(() => DoSomething()));
}
Task.WaitAll(taskList.ToArray());
好的非常简单,我有一个for循环,它会在ThreadPool中的可用线程上运行DoSomething方法,现在让我们看看如何实现这个DoSomething()函数< / p>
public void DoSomething()
{
Send off the HttpWebRequest here, with no awaits or any async programming
}
OR
public Task<ResponseData> DoSomething()
{
Write the request here that awaits for responses, streams etc
}
如果我已经将DoSomething函数发送到Task.Run函数并不意味着它已经在ThreadPool中运行它自己的Thread?意味着将DoSomething函数作为实际任务并在该范围内实现等待/异步功能变得多余?不会浪费更多资源吗?
答案 0 :(得分:2)
如果我已经将DoSomething功能发送到Task.Run 功能并不意味着它在它上面运行自己的线程 ThreadPool? 意味着将DoSomething功能变为实际功能 任务并在该范围内实现等待/异步功能 变得多余?
相反 - 当您使用另一个线程(Task.Run
)时,您正在浪费资源,而该方法不会做什么&#34; - 等待回复。
await Task.Run(() => DoSomethingSynchronously)
和await DoSomethingAsynchronously()
是不同的东西,因为正确创建的async-await
方法将在一个线程上执行。
在您的情况下,它将发送请求并将执行返回给调用者。响应到达后,它将在等待后继续执行。
因此,将Task.Run
与不执行任何操作的方法一起使用 - 只需等待响应就会浪费资源(线程)。
因为您的DoSomething
方法适用于外部资源(webervices),所以您根本不需要担心ThreadPool和线程。所有任务都可以通过async-await
方法在一个线程中异步完成。