2014-09-10 60 views
2

我一直在做这个话题的很多研究,但有很多需要和我不确定什么适用于我的情况最好。我正在做.NET应用程序运行多个“任务”(不是在.NET意义上的任务,只是我使用的单词)。每个任务都需要连续进行多项操作直至取消。通常涉及套接字连接或HttpWebRequests。我应该在后台线程中使用异步方法吗?

当前设置如下;当任务开始时,它会创建多个线程,通常是100-1000个线程。这些线程都运行相同的子程序,其中包含与该应用程序相关的操作的循环。

由于我在同一时间运行大量的HttpWebRequest/Socket连接,我希望尽可能平衡所有CPU内核的负载。目前我使用HttpWebRequest的同步GetResponse方法。由于这是发生在后台线程中,我不关心被阻塞的线程,因为我需要HttpWebResponse来继续线程操作。如果我使用Await GetResponseAsync方法,是否允许OS更好地平衡负载?

最终我想知道是否有一个点在后台线程中等待异步方法,还是无缘无故地让代码更复杂?如果没有意义,使用异步代码只是在后台线程中执行作业有什么好处?

+3

纠正我,如果我错了,但不是每个线程需要1兆的堆栈空间? – Dirk 2014-09-10 12:10:21

+0

@MattWilko这怎么可能?通常许多线程每个循环一个复杂的操作,比如我获得页面X然后POST Y,GET Z等等。如果部分失败,它通常会再次启动循环。在一个线程中使用异步方法,我假设我会异步启动GET X页面1000次,然后在回调中移动到下一部分(POST页面Y),如果某些内容失败,我将如何“重新循环”? – iguanaman 2014-09-10 12:27:47

+0

@MattWilko我相信我理解这一部分,问题是我不能只有一个循环运行,因为它不会足够满足我的需求。假设我必须使用httpwebrequest连续获取5个页面,这将构成“成功”。不过,我需要这样做,直到我说10000次成功。我不能仅仅通过这5页然后循环再次开始获取它们,这将需要永远。这就是为什么目前我有1000个线程执行相同的循环。我如何将1000线程的工作/速度合并为1? – iguanaman 2014-09-10 12:39:41

回答

1

异步/等待与线程不同。 100-1000个线程是lot,特别是对于只是做I/O。

如果您在后台线程中使用异步,可以减少必要的线程数。但是,根据您当前的描述,我同意其他评论者的意见,它听起来不像任何都需要后台线程。

异步/等待的设计遵循相同的流作为常规代码,所以如果你的代码使用try/catch重试失败,那么你async代码将使用相同的try/catch

要做连载作品(“按顺序”),只是await返回的任务:

await client.GetAsync(..); 
await client.PostAsync(..); // doesn't post until the get completes 
await client.GetAsync(..); // doesn't get until the post completes 

要做到并行工作,收集任务,然后将它们传递给Task.WhenAll

List<Task> tasks = new List<Task>(); 
for (int i = 0; i != 1000; ++i) 
{ 
    Task task = DoMyOperationAsync(); 
    tasks.Add(task); 
} 
await Task.WhenAll(tasks); 

您可能会发现我的async intro有帮助。

+0

谢谢,我会试试这个。我知道如何使用await,但不知道如何捆绑一堆等待操作并同时运行它们。 – iguanaman 2014-09-10 13:15:02

相关问题