【发布时间】:2016-09-09 10:41:51
【问题描述】:
我的系统会产生大量必须并行运行的子进程
- 请求的主线程将产生子进程并等待它们完成。
- 那些子流程做一些处理
- 然后与远程 API 对话
- 然后对来自 API 的结果进行更多处理
- 然后当所有子进程都完成(或超时)时,主线程继续运行
我们在线程计数方面遇到问题,因此我们希望通过在等待远程 API 时尝试释放线程来减少活动线程的数量。
最初我们使用WebRequest.GetResponse() 进行API 调用,这自然会在等待API 时保持空闲线程。
我们开始使用 EAP 模型(基于事件的异步编程......所有使用 IAsyncResult 的各种 .NET 方法),我们在其中调用 BeginGetResponse(CallbackTrigger),将 WaitHandles 传递回主线程,然后触发后API处理。
按照我们的理解,这意味着子进程线程终止,回调是由网卡级别的中断触发的,它会触发一个新的线程来发起回调。也就是说,在我们等待 API 调用时,没有线程等待运行 CallbackTrigger。
如果人们能够确认这种理解会很好吗?
我们现在正在考虑迁移到 TPL 模型(任务并行库 ...Task<T>),使用 WebRequest.GetResponseAsync(),即 awaitable。我的印象是这是await\ async 所做的一部分......await 在远程源等待时将控制权传递回调用堆栈,如果我启动一堆@987654331 @able Tasks 然后调用 Tasks.WaitAll 则不会为每个任务保留线程而该任务正在远程 API 上等待。
我是否正确理解了这一点?
【问题讨论】:
-
小心
WaitAll,它会冻结线程正在运行。您可能想查看WhenAll这是等待的,并在所有子任务完成后让任务恢复。 -
@Sidewinder94 是的,我们知道这一点......我们不想通过应用程序将异步代码推得太远 - 我们正在尝试(目前)只拥有这一点并行化在没有保持线程的情况下发生......我们可以在其线程上阻塞主线程。
-
我不太熟悉 TPL 如何确定地回答您的问题,尽管我认为您是正确的
-
@Sidewinder94 是的,这是我的几位同事给出的答案。希望我有时间完成一个简单的单元测试并以一种或另一种方式证明它(届时我将在此处发布答案。)
标签: c# multithreading async-await httpwebrequest task-parallel-library