【问题标题】:C# Threading not finishing when code has finished代码完成后 C# 线程未完成
【发布时间】:2013-01-13 22:35:22
【问题描述】:

我有这门课来演示我的问题:

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 所说的 Join 语句“假定阻塞当前线程,直到生成的线程完成”。这肯定会破坏多线程的对象吗?在我的 WindowsFormsApplication 中,我不想在该线程运行它的任务时阻塞任何线程。
  3. 为什么我需要加入。当然,当我的 Iteration void 完成迭代时,线程应该终止?!
  4. 我如何在新线程内部表明它已完成以便关闭线程?

【问题讨论】:

  • 我不明白这段代码如何演示任何问题。您能否更详细地描述控制台和表单应用程序之间的行为差​​异?
  • 在表单应用程序中,您几乎肯定希望直接使用BackgroundWorker 而不是Thread
  • 取出newThread.Join(),你会看到问题!!!
  • 我已经执行了这段代码,它的行为与 所期望的完全一样。问题是它的行为不像期望或期望的那样,但你没有清楚地传达那是什么。这就是我要求澄清的原因。

标签: c# winforms multithreading


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

【讨论】:

  • 第 4 点:但这就是我的观点,在 WindowsFormsApplication 中(实际上它甚至在控制台应用程序中执行此操作)它只是在迭代停止时停止,它实际上并没有退出线程.我恳求你,试试我的代码取出newThread.Join()。为什么我不能使用Thread 线程,使用我制作的类更容易。
【解决方案2】:
  1. “直接加入”是什么意思?启动线程完全有可能在另一个线程甚至被调度并命中断点之前命中 Join。您能否详细说明 Windows 窗体应用程序正在执行的操作不是您所期望的?也许在这种情况下存在导致工作线程过早退出的异常?
  2. 您没有立即致电加入。这个想法是你启动线程,在当前线程上做任何你想做的事情,当你需要第二个线程的结果时,你调用 Join 来等待它完成。
  3. 是的,枚举完成后线程将结束。
  4. 您只需要从传递给Thread 构造函数的方法返回即可。 (StartSearch 在你的情况下)。

【讨论】:

    猜你喜欢
    • 2013-12-10
    • 2016-08-28
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多