当代码完成时,c#线程没有结束

本文关键字:结束 线程 代码 完成时 | 更新日期: 2023-09-27 17:52:38

我用这个类来演示我的问题:

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. 如果Join语句,如微软所说,"应该阻塞当前线程,直到派生线程完成"。这肯定会破坏多线程的目的吗?在我的WindowsFormsApplication,我不想阻塞任何线程,而这个线程正在运行它的任务。
  3. 为什么我需要加入。当然,当我的迭代void已经完成迭代,然后线程应该终止?
  4. 我如何在新线程中指示它已经完成,以便它将关闭线程?

当代码完成时,c#线程没有结束

    使用Join你将挂起UI线程。使用BackgroundWorker组件搜索后台线程中的文件。
  1. 不要启动线程并加入它。这与在一个线程中顺序地执行所有工作是一样的,因为在这种情况下没有任何事情是异步执行的。
  2. 你不需要Join(见p2)。在UI线程中使用Join总是坏主意。
  3. 你不需要指示线程已经完成来关闭线程。当线程委托完成执行时,线程将退出。参见多线程:终止线程
  1. "go straight to the Join"是什么意思?很有可能在其他线程被调度并到达断点之前,发起线程就已经到达Join。你能详细说明一下Windows Forms应用程序在做什么,而不是你所期望的吗?也许在这种情况下有一个异常,导致工作线程过早退出?
  2. 您不立即呼叫加入。这个想法是,你启动线程,在当前线程上做任何你想做的事情,当你需要第二个线程的结果时,你调用Join来等待它完成。
  3. 是,当枚举完成时线程将结束。
  4. 您只需要从传递给Thread构造函数的方法返回。(StartSearch在你的情况下)。