【问题标题】:c# thread starts from debugger, but won't start stand-alonec#线程从调试器启动,但不会独立启动
【发布时间】:2009-01-05 10:53:02
【问题描述】:

我有一个小应用程序,可以在启动时搜索并存储大量文件的名称。我将此搜索拆分为多个 Thread 对象,每个对象搜索一个目录,并将结果推送回主线程。

当应用加载时,我会遍历每个线程并加载它:

foreach(Thread t in m_threads)
{
    t.Start();
    while(!t.IsAlive){}
}

当我在调试器中启动这个应用程序时,它会加载并且线程会快速找到所有文件。但是,如果我在调试器之外启动它会冻结。将调试器附加到进程中,我可以看到 IsAlive 永远不会返回 true。

我是 C# 线程的新手,所以有人知道出了什么问题,或者我可以如何更轻松地调试正在发生的事情吗?

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    线程可能在您检查 IsAlive 之前已完成处理。

    你为什么还要通过检查 IsAlive 标志来等待?

    为什么不启动所有线程,然后在另一个循环中调用Join() 以等待线程完成?无需勾选“IsAlive”。

    更好的是,为什么不使用 ThreadPool 而不是自己触发一堆线程呢?

    【讨论】:

      【解决方案2】:

      这可能与冻结的原因并不完全相关,但您的实施非常值得怀疑。您枚举一组线程,启动每个线程,然后阻塞直到线程完成?我认为您可能打算做的是启动所有线程,然后阻塞直到所有线程完成。 (注意:这是假设您打算写:“while(t.IsAlive) {}”,因为等待线程启动更没有意义。)

      至于冻结,我们可能需要看剩下的代码。既然您说您是 C# 线程的新手,并且看看您在上面所做的事情,我假设您也是线程的新手,这意味着可能有很多地方会出现问题。

      【讨论】:

        【解决方案3】:

        你的意思可能是IsAlive()“从不返回假”。

        好吧,如果是这样,那是因为您的线程继续无限执行。可能是你在这些线程中调用的方法有无限循环之类的。

        【讨论】:

          【解决方案4】:

          看来我误解了我为创建线程代码而剪切和粘贴的代码。我假设 while(!t.isAlive){} 行一直阻塞,直到线程可以正常启动,并认为这是必要的管理。

          我删除了该行,应用程序从调试器中正常启动。我稍后会在代码中加入线程,应该就是这样。

          有没有“NEWB!”标签? :)

          【讨论】:

            【解决方案5】:

            使用您上面提供的代码,在我看来您想按顺序启动线程。如果是这样,为什么需要很多线程? 1 个线程可以完成这项工作。

            编辑:(在你回答之后)

            好的。我看到你删除了有问题的行。

            即便如此,在您的情况下,我会考虑只使用一个线程来加载这些文件名,因为您只访问一个 IO 资源(磁盘)。每个线程都在竞争这个资源。您是否尝试在 Windows 中移动 1 个大文件,然后在第一个大文件仍在移动时移动另一个大文件?您的磁盘性能下降。因此,我只会为每个不同的 IO 资源创建一个线程。

            【讨论】:

              【解决方案6】:

              我建议不要保存线程集合,而是使用 Threadstarts。 如果您稍后加入它们,则无需等到线程运行,因此您的 while-loop 是不必要的。 确保您的线程被标记为 Background-Threads,以便在执行后自动清理它们。

              我会这样做: 列出 threadStarters = new List();

              foreach (ThreadStart ts in threadStarters)
              {
                  Thread t = new Thread(ts);
                  t.IsBackground = true;
                  t.Start();
              }
              

              【讨论】:

                【解决方案7】:

                我不知道你在你的线程中到底在做什么,但我认为......

                多线程 + 附加调试器的应用程序行为不同 = 竞争条件

                我很确定您遇到了一些同步问题。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-10-04
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多