我一直在做这个话题的很多研究,但有很多需要和我不确定什么适用于我的情况最好。我正在做.NET应用程序运行多个“任务”(不是在.NET意义上的任务,只是我使用的单词)。每个任务都需要连续进行多项操作直至取消。通常涉及套接字连接或HttpWebRequests。我应该在后台线程中使用异步方法吗?
当前设置如下;当任务开始时,它会创建多个线程,通常是100-1000个线程。这些线程都运行相同的子程序,其中包含与该应用程序相关的操作的循环。
由于我在同一时间运行大量的HttpWebRequest/Socket连接,我希望尽可能平衡所有CPU内核的负载。目前我使用HttpWebRequest的同步GetResponse方法。由于这是发生在后台线程中,我不关心被阻塞的线程,因为我需要HttpWebResponse来继续线程操作。如果我使用Await GetResponseAsync方法,是否允许OS更好地平衡负载?
最终我想知道是否有一个点在后台线程中等待异步方法,还是无缘无故地让代码更复杂?如果没有意义,使用异步代码只是在后台线程中执行作业有什么好处?
纠正我,如果我错了,但不是每个线程需要1兆的堆栈空间? – Dirk 2014-09-10 12:10:21
@MattWilko这怎么可能?通常许多线程每个循环一个复杂的操作,比如我获得页面X然后POST Y,GET Z等等。如果部分失败,它通常会再次启动循环。在一个线程中使用异步方法,我假设我会异步启动GET X页面1000次,然后在回调中移动到下一部分(POST页面Y),如果某些内容失败,我将如何“重新循环”? – iguanaman 2014-09-10 12:27:47
@MattWilko我相信我理解这一部分,问题是我不能只有一个循环运行,因为它不会足够满足我的需求。假设我必须使用httpwebrequest连续获取5个页面,这将构成“成功”。不过,我需要这样做,直到我说10000次成功。我不能仅仅通过这5页然后循环再次开始获取它们,这将需要永远。这就是为什么目前我有1000个线程执行相同的循环。我如何将1000线程的工作/速度合并为1? – iguanaman 2014-09-10 12:39:41