私は次の2つの方法を使用しています。DoMyWork1 と呼ばれるメソッドは、3 つのスレッドで 3 つのメソッドを実行するのに 6 秒かかるなど、適切にスケーリングします。一方、DoMyJob メソッドはまったくスケーリングしません。1 つのスレッドに 4 秒かかる場合、3 つのスレッドを実行するには 13 秒かかります。私は何を間違っていますか?ファイルの読み取りおよび/または書き込みには、スレッド プール以外の特別なスレッド処理が必要ですか?
私の呼び出しコード
public static void Process(MyDelegate md , int threads)
{
int threadcount = threads;
ManualResetEvent[] doneEvents = new ManualResetEvent[threadcount];
DateTime dtstart = DateTime.Now;
List<string> myfiles = GetMyFiles(@"c:\");
for (int i = 0; i < threadcount; i++)
{
doneEvents[i] = new ManualResetEvent(false);
MyState ms = new MyState();
ms.ThreadIndex = i;
ms.EventDone = doneEvents[i];
ms.files = myfiles;
ThreadPool.QueueUserWorkItem(md.Invoke, ms);
}
WaitHandle.WaitAll(doneEvents);
DateTime dtend = DateTime.Now;
TimeSpan ts = dtend - dtstart;
Console.WriteLine("All complete in {0} seconds.", ts.ToString());
Console.ReadLine();
}
public static void DoMyWork1(Object threadContext)
{
MyState st = (MyState)threadContext;
Console.WriteLine("thread {0} started...", st.ThreadIndex);
Thread.Sleep(5000);
Console.WriteLine("thread {0} finished...", st.ThreadIndex);
st.EventDone.Set();
}
private static void DoMyJob(MyState st)
{
Console.WriteLine("I am in thread {0} started...", st.ThreadIndex);
string[] mystrings = new string[] { "one", "two", "three" };
foreach (string s in mystrings)
{
foreach (string file in st.files)
{
if (!(new StreamReader(file).ReadToEnd().Contains(s)))
{
AppendToFile(String.Format("{0} word searching in file {1} in thread {2}", s, file, st.ThreadIndex));
}
}
}
Console.WriteLine("I am in thread {0} ended...", st.ThreadIndex);
}