Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用异步webrequests执行多线程_C#_Multithreading_Asynchronous_Httpwebrequest_Task Parallel Library - Fatal编程技术网

C# 如何使用异步webrequests执行多线程

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任务是有意义的 经过许多不同

我正在尝试实现.NET4帮助程序/实用程序类,它应该根据webtesting工具的url列表检索HTML页面源。解决方案应具有可扩展性和高性能

我已经研究和尝试不同的解决方案很多天了,但找不到合适的解决方案

根据我的理解,实现我的目标的最佳方法是使用使用TPL并行运行的异步webrequests

为了完全控制标题等,我使用了HttpWebResponse,而不是包装HttpWebResponse的WebClient。在某些情况下,输出应该链接到其他任务,因此使用TPL任务是有意义的

经过许多不同的尝试/方法,我迄今为止所取得的成就

  • 实现了基本的同步、异步(APM)和并行(使用TPL任务)解决方案,以查看不同解决方案的性能级别

  • 为了查看异步并行解决方案的性能,我使用了APM方法BeginGetResponse和BeginRead,并在parallel.ForEach中运行它。一切都很好,我对表演很满意。不知何故,我觉得使用simple Parallel.ForEach不是一个好办法,例如,我不知道如何使用任务链接

  • 然后,我尝试使用更复杂的系统,通过使用TaskCompletionSource和迭代器在APM流中进行迭代,使用tasks包装APM解决方案。我相信这个解决方案可能就是我正在寻找的,但是有一个奇怪的延迟,大约在6-10秒之间,当运行500个URL列表时会发生2-3次

    根据日志,执行返回到线程,该线程在延迟发生时在循环中调用异步获取。当执行移回循环时,延迟并不总是发生,只有2-3次,其他时间可以正常工作。看起来,循环线程将创建一组任务,这些任务将由其他线程处理,当大多数/所有任务完成时,在循环继续创建剩余任务和其他线程再次激活之前,将有延迟(6-8秒)

  • 循环内部迭代器的原理是:

    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框架
    如果您认为我上面介绍的使用APM、TaskCompletionSource和迭代器的解决方案是好的,我将非常感谢您对解决延迟问题的任何帮助

    我对C#和Windows开发完全是新手,所以如果我尝试的东西没有太多意义,请不要介意

    如果没有解决这个问题,我将不得不放弃我的测试工具开发,任何帮助都将不胜感激


    感谢

    在TPL.NET之前,使用迭代器是一个很好的解决方案(例如,MS Robotics的协调和并发运行时(CCR)大量使用了迭代器,并帮助激发了TPL)。一个问题是,迭代器本身并不能满足您的需要——您还需要一个调度器来有效地分配工作负载。这几乎是由Stephen Toub链接到的代码片段完成的-但请注意一行:

    enumerator.Current.ContinueWith(recursiveBody, TaskContinuationOptions.ExecuteSynchronously);
    
    我认为您所看到的间歇性问题可能与强制“执行同步”有关——这可能会导致工作在可用内核/线程之间分布不均匀


    看看Stephen提出的其他一些备选方案。特别是,请查看仅执行ContinueWith()调用的简单链接将做什么(如果需要,然后是匹配的Unwrap()调用)。语法不会是最漂亮的,但它是最简单的,并且对底层工作窃取运行时的干扰尽可能小,因此,您将有望获得更好的结果。

    您能否更详细地解释一下您是如何使用迭代器的,以及为什么您认为将其作为迭代器是有用的?在尝试了各种解决方案后,我最终使用了基于msdn博客上MS专家建议的迭代器。我的解决方案和博客差不多,只是增加了超时和日志记录。我没有任何特定的理由使用迭代器,我对任何有效的解决方案都持开放态度。代码片段链接:感谢您的建议和评论。我会仔细看看斯蒂芬的博客。