這進一步是我的問題here.NET 2.0處理線程池使用
通過做一些閱讀非常大名單....我搬到遠離信號燈來線程池。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ThreadPoolTest
{
class Data
{
public int Pos { get; set; }
public int Num { get; set; }
}
class Program
{
static ManualResetEvent[] resetEvents = new ManualResetEvent[20];
static void Main(string[] args)
{
int s = 0;
for (int i = 0; i < 100000; i++)
{
resetEvents[s] = new ManualResetEvent(false);
Data d = new Data();
d.Pos = s;
d.Num = i;
ThreadPool.QueueUserWorkItem(new WaitCallback(Process), (object)d);
if (s >= 19)
{
WaitHandle.WaitAll(resetEvents);
Console.WriteLine("Press Enter to Move forward");
Console.ReadLine();
s = 0;
}
else
{
s = s + 1;
}
}
}
private static void Process(object o)
{
Data d = (Data) o;
Console.WriteLine(d.Num.ToString());
Thread.Sleep(10000);
resetEvents[d.Pos].Set();
}
}
}
此代碼的工作原理和我能夠處理的20集。但我不喜歡這個代碼,因爲WaitAll。假設我開始一批20個,3個線程需要更長的時間,而17個完成。即使這樣,我仍會保持17個線程等待,因爲WaitAll。
WaitAny本來是不錯的......但是爲了有效地使用池,我必須構建如堆棧,列表,隊列等控制結構似乎相當麻煩。
我不喜歡的另一件事是整個全局變量在類的resetEvents。因爲這個數組必須在Process方法和主循環之間共享。
上面的代碼工作...但我需要你的幫助來改進它。
再次......我在.NET 2.0 VS 2008.我不能使用.NET 4.0並行/異步框架。
我敢肯定,我做錯了什麼,但我的代碼總是暫停無限期地在第26行(_sem.WaiteOne();)。 我添加了一個計數器來檢查while(semCount = MaxThreads)return;在第25行。 這似乎工作,但感覺像一個黑客,我想了解爲什麼你的解決方案不適用於我... –
GojiraDeMonstah
2013-10-31 14:16:21
@GojiraDeMonstah:你的修改是正確的。我的代碼有一個錯誤。我在我的例子中修改了這個循環。感謝您爲我找到。 – 2013-10-31 14:25:35