问题是,提供这些页面的服务器对并发请求有限制。因此,最多只能同时请求3个页面。
我想通过使用线程池来实现这一点,我甚至成功构建了一个简单的应用程序(锁定了DataTable),但我无法限制并发线程(即使使用SetMaxThreads),似乎它只是忽略了限制。
是否有人有现成的类似功能的解决方案?我很想看看。
我尝试使用信号量,但遇到了问题:
static SemaphoreSlim _sem = new SemaphoreSlim(3); // Capacity of 3
static List<string> records = new List<string>();
static void Main()
{
records.Add("aaa");
records.Add("bbb");
records.Add("ccc");
records.Add("ddd");
records.Add("eee");
records.Add("fff");
records.Add("ggg");
records.Add("iii");
records.Add("jjj");
for (int i = 0; i < records.Count; i++ )
{
new Thread(ThreadJob).Start(records[i]);
}
Console.WriteLine(records.Count);
Console.ReadLine();
}
static void ThreadJob(object id)
{
Console.WriteLine(id + " wants to enter");
_sem.Wait();
Console.WriteLine(id + " is in!"); // Only three threads
//Thread.Sleep(1000 * (int)id); // can be here at
Console.WriteLine(id + " is leaving"); // a time.
lock (records)
{
records.Remove((string)id);
}
_sem.Release();
}
这个运行得很好,唯一的问题是,
Console.WriteLine(records.count);
返回不同的结果。 尽管我知道这是因为并非所有线程都已完成(而且在删除所有记录之前,我调用了records.count),但我找不到如何等待所有线程完成的方法。
ThreadJob
ж–№жі•дёӯ并еҸ‘иҜ·жұӮзҡ„ж•°йҮҸпјҢиҝҷдёӘзӨәдҫӢеҸӘжҳҜзЎ®дҝқжүҖжңүзәҝзЁӢйғҪе·Іе®ҢжҲҗгҖӮ - vgru