【问题标题】:How to Managed ALL running Threads in C# console appication?如何在 C# 控制台应用程序中管理所有正在运行的线程?
【发布时间】:2011-08-13 19:10:20
【问题描述】:

我在控制台应用程序中遇到问题管理线程并行。
我正在并行运行 10 个线程,所有线程都在执行某些特定任务。
如果任何任务结束/完成,则停止/结束线程并立即启动新线程实例。
我想要 10 个线程,所以任何线程都会停止/结束,然后它会生成新线程。
但每次我希望控制台应用程序中有 10 个线程处于运行模式时 &
它应该是使用 C# 控制台应用程序并行工作。
如何在 C# 控制台应用程序中运行 10 个线程?

【问题讨论】:

  • 为这样的任务想到了一个线程池。另外,您的问题毫无意义,尤其是在最后。请改写。
  • @Alex 为什么我的问题没有意义..?
  • 如果你有10个线程,为什么要让它们退出,只为创建一个新线程?为什么不对现有线程做更多的工作?
  • @spender 我有 10 个不同的任务,所以我运行 10 个单独的线程。如何从现有线程中执行更多任务?请详细解释多线程。

标签: c# multithreading thread-safety console-application threadpool


【解决方案1】:

在每个线程结束时,在某个共享对象上加锁(lock (obj) {})。 然后从您拥有的线程集合中删除当前线程。 如果 collection.Count 小于 10,则创建一个新的并放入集合中。 释放锁。

private List<Thread> threads = new List<Thread>();

private void ThreadFunction() {
  // do something
  // here before the lock
  lock (threads) {
    threads.Remove(Thread.CurrentThread);
    if (thread.Count < 10) {
      Thread t = new Thread(ThreadFunction);
      threads.Add(t);
      t.Start();
    }
  }
}

确保捕获线程内的所有异常,否则当线程异常发生时您的代码将失败。那就是确保代码的锁定部分总是被调用(除了线程中止异常,但这无关紧要)。

但如前所述,我认为您应该为此类任务使用 ThreadPool...

【讨论】:

    【解决方案2】:

    .Net 中关于线程的书是:http://www.albahari.com/threading/ 仅此一项就可能会回答您的任何问题。

    根据您使用这些线程的目的(我猜您可能在谈论在后台运行事务),您可能想要使用 BackgroundWorker。

    http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

    BackgroundWorker 让您只处理 Begin/End/Progress 事件,使调试更不容易出错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-30
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      • 2015-08-17
      相关资源
      最近更新 更多