初始情况
我正在开发一个 .NET Framework 4.0、C#、Winform 应用程序。应用程序将在 GridView 中列出(并测试)WebServiceOperations(当前有 60 个 DataRows => WebServiceOperations)。
客观的
我必须通过单击按钮来测试/调用所有这些操作。每个操作都会创建一个类的新实例。在这个类中,我调用 WebServiceOperation async 并等待结果。然后对结果进行验证。整个代码使用委托和事件可以顺利运行。
现在是挑战/问题:单击该按钮时,我使用 for 循环 (int i = 0; i < gridViewWsOperations.RowCount; i++) => 换句话说,目前我正在对他们进行 60 次操作'同时' => 服务器同时处理 60 个请求时超载,我得到超时。所以我需要以某种方式限制并发请求的数量,让我们同时说 10 个。考虑一下,for 循环(我必须将请求排入队列)与我将请求出列的方法(process_result 事件)不在同一个线程中。我使用 ConcurrentQueue 进行了尝试,因为这种类型的集合似乎是线程安全的。
链接
一个示例代码真的很有帮助!
--- 这是我的解决方案/示例代码 ---
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);
}
}
}