C# 循环节流

C# 循环节流,c#,winforms,stack,queue,concurrent-collections,C#,Winforms,Stack,Queue,Concurrent Collections,初始情况 我正在开发一个.NETFramework4.0、C#、Winform应用程序。应用程序将在GridView中列出(并测试)WebServiceOperations(当前有60个DataRows=>WebServiceOperations) 目标 我必须通过点击按钮来测试/调用所有这些操作。每个操作都会创建一个类的新实例。在这个类中,我调用WebServiceOperationAsync并等待结果。然后对结果进行验证。使用委托和事件,整个代码可以顺利运行 现在是挑战/问题:单击该按钮时,

初始情况

我正在开发一个.NETFramework4.0、C#、Winform应用程序。应用程序将在GridView中列出(并测试)WebServiceOperations(当前有60个DataRows=>WebServiceOperations)

目标

我必须通过点击按钮来测试/调用所有这些操作。每个操作都会创建一个类的新实例。在这个类中,我调用WebServiceOperationAsync并等待结果。然后对结果进行验证。使用委托和事件,整个代码可以顺利运行

现在是挑战/问题:单击该按钮时,我使用for循环(int i=0;i换句话说,当前我在“同一时间”触发60个操作=>服务器在同一时间超负荷处理60个请求,并且超时。因此,我需要以某种方式将concurrend请求的数量限制在10个左右。 考虑一下,for循环(在这里我必须排队请求)与我在队列中卸载请求的方法(PurryReultRevices事件)不在同一线程中。我尝试使用ConcurrentQueue,因为这种类型的集合似乎是线程安全的

链接

一个示例代码将非常有用

---这是我的解决方案/示例代码--

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Collections.Concurrent;
使用系统线程;
命名空间ConcurrentQueueSample
{
班级计划
{
静态信号量slim信号量slim=新信号量slim(3);
静态void Main(字符串[]参数)
{
System.Timers.Timer Timer=新的System.Timers.Timer();
timer.appeated+=新系统.Timers.ElapsedEventHandler(timer_appeated);
定时器间隔=1234;
timer.Enabled=true;
timer.Start();
对于(inti=0;i<10;i++)新线程(go);
}
静态无效计时器(对象发送器,System.Timers.ElapsedEventArgs e)
{
semaphoreSlim.Release();
}
静态无效go(对象i)
{
WriteLine(“id:{0}”,i);
semaphoreSlim.Wait();
WriteLine(“id:{0}在”,i);
睡眠(1250);
WriteLine(“id:{0}左!”,i);
}
}
}

您可能想看看如何使用类来限制有权访问队列的线程。

尝试使用信号量您可以在调用web服务的类中使用信号量来限制并发请求的数量。
信号量lim.Release()
不应在计时器中,它应该是在
go
中调用的最后一个东西。此外,您可能希望使用线程而不是完整线程。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.Concurrent;
using System.Threading;

namespace ConcurrentQueueSample
{
    class Program
    {
        static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(3);

        static void Main(string[] args)
        {
            System.Timers.Timer timer = new System.Timers.Timer();
            timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
            timer.Interval = 1234;
            timer.Enabled = true;
            timer.Start();

            for (int i = 0; i < 10; i++) new Thread(go).Start(i);
        }

        static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            semaphoreSlim.Release();
        }

        static void go(object i)
        {
            Console.WriteLine("id: {0}", i);
            semaphoreSlim.Wait();
            Console.WriteLine("id: {0} is in", i);
            Thread.Sleep(1250);
            Console.WriteLine("id: {0} left!", i);
        }
    }
}