다음 두 가지 방법을 사용하고 있습니다. DoMyWork1이라는 메서드는 3 개의 스레드에서 3 개를 실행하는 데 6 초가 걸리는 것처럼 잘 확장됩니다. 반면 DoMyJob 메서드는 전혀 확장되지 않습니다. 하나의 쓰레드가 4 초 걸리면 3 개의 쓰레드를 실행하는데 13 초가 걸립니다. 내가 도대체 뭘 잘못하고있는 겁니까? 파일 읽기 및 쓰기에 스레드 풀 이외의 특별한 스레드 처리가 필요합니까?vs2008 C# : 스레드 풀 질문
내 호출 코드
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);
}
스레드를 발송하는 데 사용하는 코드를 추가 할 수 있습니까? –
공용 static void 프로세스 (MyDelegate md, int threads) { int threadcount = threads; ManualResetEvent [] doneEvents = new ManualResetEvent [threadcount]; DateTime dtstart = DateTime.지금; 목록 myfiles = GetMyFiles (@ "c : \"); (int i = 0; i