c# - 同时运行 x 个 Web 请求

标签 c# multithreading asynchronous webrequest

我们公司有一个 Web 服务,我想通过我自己的 HTTPWebRequest 客户端在 C# 中发送 XML 文件(存储在我的驱动器上)。这已经有效。 Web 服务同时支持 5 个同步请求(一旦服务器上的处理完成,我就会从 Web 服务获得响应)。每个请求的处理大约需要 5 分钟。

抛出太多请求(> 5)会导致我的客户端超时。此外,这可能会导致服务器端错误和数据不连贯。在服务器端进行更改不是一种选择(来自不同的供应商)。

现在,我的 Webrequest 客户端将发送 XML 并使用 result.AsyncWaitHandle.WaitOne(); 等待响应

但是,尽管 Web 服务支持 5 个请求,但这样一次只能处理一个请求。我尝试使用 BackgroundworkerThreadpool 但它们创建了太多请求同时请求,这使它们对我毫无用处。任何建议,如何解决这个问题?创建我自己的 Threadpool 恰好有 5 个线程?有什么建议,如何实现?

最佳答案

最简单的方法是创建 5 个线程(另外:这是一个奇数!),它们使用 BlockingCollection 中的 xml 文件。

类似于:

var bc = new BlockingCollection<string>();

for ( int i = 0 ; i < 5 ; i++ )
{
    new Thread( () =>
        {
            foreach ( var xml in bc.GetConsumingEnumerable() )
            {
                // do work
            }
        }
    ).Start();
}

bc.Add( xml_1 );
bc.Add( xml_2 );
...
bc.CompleteAdding(); // threads will end when queue is exhausted

关于c# - 同时运行 x 个 Web 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7878603/

相关文章:

javascript - 在不发出值的情况下完成的 Rxjs 可观察通过单元测试,但不应该

c# - 在 C# 窗体应用程序中访问程序集信息 GUID

c# - 使用 Windows 窗体应用程序时如何将鼠标光标更改为自定义光标?

c# - 如何在单独的线程中将文件保存到硬盘?

ios - UIActivityIndi​​catorView 在异步任务期间不显示

java - 一起使用@Scheduled 和@Async?

c# - RemoveAll() 的目的

c# - 以下线程安全吗?

multithreading - MATLAB 中的多线程

multithreading - LWJGL3共享上下文抛出 “GLFW_VERSION_UNAVAILABLE”