我的情况与multiple threads calling same method in c#略有不同。我有几个线程调用的相同函数,这个函数读取不同线程中的不同文件。在此函数中,还有另一个所有线程调用的方法。但是没有一个线程完成读取文件,因此永远不会调用最后一个Console.WriteLine()。
Thread[] threads = new Thread[numThreads];
for (int i = 0; i < numThreads; i++) {
int temp = i;
threads[i] = new Thread(() => readFiles(temp));
threads[i].Start();
}
public void readFiles(int threadId) {
// this is called
Console.WriteLine("Thread {0} starting...", threadId);
string line = "";
StreamReader sr = new StreamReader(tempFolder + threadId + ".txt");
int cnt = 0;
while ((line = sr.ReadLine()) != null)
{
//dosmething(line);
cnt++;
}
// this is never reached, no matter whether I comment out dosomething() or not
Console.WriteLine("Thread {0} total {1} lines...", threadId, cnt);
sr.Close();
}
答案 0 :(得分:0)
我最好的猜测是:读取文件时出错(例如路径错误,文件不存在等)导致线程终止(因此不执行所有行),或者(更少)可能)存在无限循环。
试试这个:
for(;;){
foreach(var t in threads) Console.WriteLine(t.IsAlive);
Thread.Sleep(1000);
}
看看它出来了什么?
另请注意,您没有检查线程是否正常终止或在代码中引发异常。你不应该只生成线程并要求他们做一些事情而不关心工作是否完成。这就是为什么,Task<>
类存在于.NET中。它简化了手动管理线程的繁重工作。