C#中的多线程:代码行永远不会到达

时间:2014-07-03 18:06:29

标签: c# multithreading

我的情况与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();
}

1 个答案:

答案 0 :(得分:0)

我最好的猜测是:读取文件时出错(例如路径错误,文件不存在等)导致线程终止(因此不执行所有行),或者(更少)可能)存在无限循环。

试试这个:

for(;;){
    foreach(var t in threads) Console.WriteLine(t.IsAlive);
    Thread.Sleep(1000);
}

看看它出来了什么?

另请注意,您没有检查线程是否正常终止或在代码中引发异常。你不应该只生成线程并要求他们做一些事情而不关心工作是否完成。这就是为什么,Task<>类存在于.NET中。它简化了手动管理线程的繁重工作。