C#代码完成后线程未完成

时间:2013-01-13 22:35:23

标签: c# winforms multithreading

我有这堂课来证明我的问题:

class Program
{
    static List<FileInfo> _foundFiles;
    static int _numberPadding = 0;
    static Thread newThread;

    static void Main(string[] args)
    {
        _foundFiles = new List<FileInfo>();

        _shouldStop = false;
        newThread = new Thread(new ThreadStart(StartSearch));
        newThread.Start();

        newThread.Join();

        Console.WriteLine("Finished");
        Console.ReadKey();
    }

    static volatile bool _shouldStop;

    static void StartSearch()
    {
        IterateFileSystemNon(new DirectoryInfo(@"D:\OLD Melman\Music Backup\iTunes 28-06-11\Music"));
    }

    static void IterateFileSystemNon(DirectoryInfo folder)
    {
        string pad = CreatePadding();

        Console.WriteLine("{0} Directory: {1}", pad, folder.Name);

        foreach (var dir in folder.GetDirectories())
            IterateFileSystemNon(dir);

        pad = CreatePadding();

        foreach (var file in folder.GetFiles())
        {
            if (file.Extension.Contains("mp3"))
            {
                _foundFiles.Add(file);

                Console.WriteLine("{0} File: {1}", pad, file.Name);
            }
        }

        _numberPadding = _numberPadding - 6;
    }

    static string CreatePadding()
    {
        _numberPadding = _numberPadding + 3;

        var stringRepOfPadding = new StringBuilder(_numberPadding);
        for (int i = 0; i < _numberPadding; i++)
        {
            stringRepOfPadding.Append(" ");
        }
        return stringRepOfPadding.ToString();
    }
}

我有这些问题:

  1. 这适用于控制台应用,但这不适用于WindowsFormsApplication,只是直接转到Join语句,为什么会这样?
  2. 如果Microsoft声明的加入语句&#34;假设阻止当前线程,直到生成的线程完成&#34;。当然这会打败多线程的对象?在我的WindowsFormsApplication中,我不想在此线程运行它的任务时阻止任何线程。
  3. 为什么我需要加入。当我的Iteration void完成迭代时,线程应该终止?!
  4. 新线程内部如何表明它已完成,以便关闭线程?

2 个答案:

答案 0 :(得分:1)

  1. 使用Join,您将挂起UI线程。使用BackgroundWorker组件在后台线程中搜索文件。
  2. 不要启动线程并加入它。这与在一个线程中按顺序执行所有工作相同,因为在这种情况下不会异步执行任何操作。
  3. 您不需要加入(参见第2页)。使用Join in UI线程总是坏主意。
  4. 您不需要指示线程已完成以关闭线程。当线程委托完成执行时,线程将退出。请参阅Multithreading: Terminating Threads

答案 1 :(得分:0)

  1. “直接加入”是什么意思?启动线程很可能会在其他线程被调度并命中断点之前触及Join。你能详细说明Windows Forms应用程序正在做什么并不是你所期望的吗?也许在这种情况下会导致工作线程过早退出?
  2. 你没有 立即致电加入。我们的想法是你启动线程,在当前线程上做你想做的任何事情,当你需要第二个线程的结果时,你调用Join来等待它完成。
  3. 是的,线程将在枚举完成时结束。
  4. 您只需要从传递给Thread构造函数的方法返回。 (在你的情况下StartSearch)。