代码之家  ›  专栏  ›  技术社区  ›  Xn0vv3r

的多线程库。导航战鉴定小组

  •  10
  • Xn0vv3r  · 技术社区  · 17 年前

    我在一些程序中使用了多线程,但仍然感觉不太舒服。

    C#的多线程库是什么。NET已经存在,两者相比有哪些优势?

    我所说的多线程库是指所有有助于使多线程编程更容易的东西。

    什么。NET集成集(即ThreadPool)是否定期使用? 你遇到了哪些问题?

    10 回复  |  直到 13 年前
        1
  •  12
  •   Barry Kelly    17 年前

    在应用程序中使用多线程有各种原因:

    • UI响应性
    • 并行操作
    • 并行加速

    应该选择的方法取决于你想做什么。对于UI响应性,考虑使用 BackgroundWorker 例如。

    对于并发操作(例如服务器:没有 要并行,但即使在单核系统上也可能需要并发),可以考虑使用线程池,或者,如果任务寿命长并且需要很多任务,可以考虑每个任务使用一个线程。

    如果你有一个所谓的令人尴尬的并行问题,可以很容易地划分为小的子问题,可以考虑使用一个从队列中提取任务的工作线程池(与CPU内核一样多的线程)。微软 Task Parallel Library (TPL) 可能在这里有所帮助。如果作业可以很容易地表示为一元流计算(即使用LINQ中的查询进行转换和聚合等工作),那么在TPL之上运行的并行LINQ(相同链接)可能会有所帮助。

    还有其他方法,例如 Actor-style parallelism 如Erlang所示,在Erlang中更难有效地实现。NET,因为缺乏绿色线程模型或实现绿色线程模型的方法,如CLR支持的延续。

        2
  •  3
  •   Simon Randy Burden    17 年前
        3
  •  2
  •   Tim Cooper    14 年前

    看看 Power Threading 图书馆。

        4
  •  2
  •   Leigh josh poley    13 年前

    在我的日子里,我写了很多线程代码,甚至实现了我自己的线程池;调度员。这里记录了很多:

    http://web.archive.org/web/20120708232527/http://devplanet.com/blogs/brianr/default.aspx

    只要意识到我写这些是为了非常具体的目的,并在这些条件下进行了测试,就没有真正的灵丹妙药。

        5
  •  1
  •   Brian Rasmussen    17 年前

    我的建议是,在迁移到任何其他库之前,先熟悉线程池。很多框架代码都使用线程池,所以即使你碰巧找到了最佳线程库(TM),你仍然必须使用线程库,所以你真的需要了解这一点。

    您还应该记住,在实现线程池和对其进行调优方面已经做了很多工作。NET的并行库的发展带来了许多改进。

    在我看来,通过了解当前线程池的优缺点,可以修正其许多“问题”。

        6
  •  1
  •   Richard Szalay    17 年前

    请记住,当你不再需要线程时,你真的应该关闭线程(或允许线程池处理),除非你很快会再次需要它们。我这么说的原因是,每个线程都需要堆栈内存(通常为1mb),所以当你的应用程序位于线程上但不使用它们时,你就是在浪费内存。

    例如,我机器上的Outlook现在有20个线程打开,CPU使用率为0%。这简直是浪费(至少)20mb的内存。Word还使用了另外10个线程,CPU为0%。30mb可能看起来不多,但如果每个应用程序都浪费了10-20个线程呢?

    同样,如果你需要定期访问线程池,那么你不需要关闭它(创建/销毁线程会产生开销)。

        7
  •  1
  •   tuinstoel    17 年前

    您不必显式使用线程池,如果需要异步调用,可以使用BeginInvoke EndInvoke。它在幕后使用线程池。请看这里: http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx

        8
  •  1
  •   Matt Davison    17 年前

    你应该看看 Concurrency & Coordination Runtime 。CCR一开始可能有点令人望而生畏,因为它需要一种略有不同的心态。这 video 对它的工作原理有很好的解释。..

    在我看来,这将是正确的做法,我还听说它将使用与 TPL .

        9
  •  0
  •   Kevin Vaughan    17 年前

    对我来说,框架的内置类已经足够了。这个 Threadpool 很奇怪,也很蹩脚,但你可以很容易地写自己的。

    我经常使用 BackgroundWorker Frontends类,因为它使生活变得更容易——事件处理程序的调用是自动完成的。

    我经常手动启动线程,并使用 ManualResetEvent 以便能够检查其中谁已经结束了。我用 WaitHandle.WaitAll() 方法。问题是,那个WaitHandle。WaitAll不会一次访问超过64个WaitHandles的数组。

        10
  •  0
  •   jake.stateresa    17 年前

    您可能想看看关于线程模式的系列文章。现在,它有实现WorkerThread和ThreadedQueue的示例代码。

    http://devpinoy.org/blogs/jakelite/archive/tags/Threading+Patterns/default.aspx