Я использую следующие 2 метода. Метод, называемый DoMyWork1, действительно хорошо масштабируется, так как требуется 6 секунд для запуска трех из них в 3 потоках. В то время как метод 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);
}
Можете ли вы добавить код, используемый для отправки тем? –
public static void Process (MyDelegate md, int threads) { int threadcount = threads; ManualResetEvent [] doneEvents = new ManualResetEvent [threadcount]; ДатаTime dtstart = DateTime.Теперь; Список myfiles = GetMyFiles (@ "c: \"); для (int i = 0; i