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