C# 如何使用异步webrequests执行多线程
我正在尝试实现.NET4帮助程序/实用程序类,它应该根据webtesting工具的url列表检索HTML页面源。解决方案应具有可扩展性和高性能 我已经研究和尝试不同的解决方案很多天了,但找不到合适的解决方案 根据我的理解,实现我的目标的最佳方法是使用使用TPL并行运行的异步webrequests 为了完全控制标题等,我使用了HttpWebResponse,而不是包装HttpWebResponse的WebClient。在某些情况下,输出应该链接到其他任务,因此使用TPL任务是有意义的 经过许多不同的尝试/方法,我迄今为止所取得的成就C# 如何使用异步webrequests执行多线程,c#,multithreading,asynchronous,httpwebrequest,task-parallel-library,C#,Multithreading,Asynchronous,Httpwebrequest,Task Parallel Library,我正在尝试实现.NET4帮助程序/实用程序类,它应该根据webtesting工具的url列表检索HTML页面源。解决方案应具有可扩展性和高性能 我已经研究和尝试不同的解决方案很多天了,但找不到合适的解决方案 根据我的理解,实现我的目标的最佳方法是使用使用TPL并行运行的异步webrequests 为了完全控制标题等,我使用了HttpWebResponse,而不是包装HttpWebResponse的WebClient。在某些情况下,输出应该链接到其他任务,因此使用TPL任务是有意义的 经过许多不同
IEnumerable<Task> DoExample(string input)
{
var aResult = DoAAsync(input);
yield return aResult;
var bResult = DoBAsync(aResult.Result);
yield return bResult;
var cResult = DoCAsync(bResult.Result);
yield return cResult;
…
}
Task t = Iterate(DoExample(“42”));
IEnumerable DoExample(字符串输入)
{
var aResult=doasync(输入);
收益率结果;
var bResult=DoBAsync(aResult.Result);
收益率;
var cResult=DoCAsync(bResult.Result);
收益率收益率;
…
}
任务t=迭代(DoExample(“42”);
我正在通过使用System.Net.ServicePointManager.DefaultConnectionLimit和使用ThreadPool.RegisterWaitForSingleObject的超时来解析连接限制
我的问题很简单,实现用于检索html页面的helper/utility类的最佳方法是什么:
- 具有可扩展性和高性能
- 使用webrequests
- 易于与其他任务关联
- 能够使用超时
- 使用.NET4框架
感谢在TPL.NET之前,使用迭代器是一个很好的解决方案(例如,MS Robotics的协调和并发运行时(CCR)大量使用了迭代器,并帮助激发了TPL)。一个问题是,迭代器本身并不能满足您的需要——您还需要一个调度器来有效地分配工作负载。这几乎是由Stephen Toub链接到的代码片段完成的-但请注意一行:
enumerator.Current.ContinueWith(recursiveBody, TaskContinuationOptions.ExecuteSynchronously);
我认为您所看到的间歇性问题可能与强制“执行同步”有关——这可能会导致工作在可用内核/线程之间分布不均匀
看看Stephen提出的其他一些备选方案。特别是,请查看仅执行ContinueWith()调用的简单链接将做什么(如果需要,然后是匹配的Unwrap()调用)。语法不会是最漂亮的,但它是最简单的,并且对底层工作窃取运行时的干扰尽可能小,因此,您将有望获得更好的结果。您能否更详细地解释一下您是如何使用迭代器的,以及为什么您认为将其作为迭代器是有用的?在尝试了各种解决方案后,我最终使用了基于msdn博客上MS专家建议的迭代器。我的解决方案和博客差不多,只是增加了超时和日志记录。我没有任何特定的理由使用迭代器,我对任何有效的解决方案都持开放态度。代码片段链接:感谢您的建议和评论。我会仔细看看斯蒂芬的博客。