C# 线程问题-为了获得最佳性能,什么时候应该线程,什么时候不应该线程?

C# 线程问题-为了获得最佳性能,什么时候应该线程,什么时候不应该线程?,c#,multithreading,C#,Multithreading,我的问题是,我什么时候该穿线,什么时候不该穿线 谁能给出一些一般规则 假设我有一个主窗体,我想在另一个线程中做一些业务 我应该: 创建一个新线程,比如threadt=newthread(newthreadstart(ThreadProc)) 声明一个委托,比如myDelegate.BeginInvoke(IsyncCallback)(委托,不是控件,是:) 创建一个System.ComponentModel.BackgroundWorker() 为了最好的表现 示例场景: 从数据库获取数据

我的问题是,我什么时候该穿线,什么时候不该穿线

谁能给出一些一般规则

假设我有一个主窗体,我想在另一个线程中做一些业务

我应该:

  • 创建一个新线程,比如
    threadt=newthread(newthreadstart(ThreadProc))
  • 声明一个委托,比如
    myDelegate.BeginInvoke(IsyncCallback)
    (委托,不是控件,是:)
  • 创建一个
    System.ComponentModel.BackgroundWorker()
为了最好的表现

示例场景:

  • 从数据库获取数据以进行控制,或进行严重的后台计算
  • 可能是多线程的,如果它有点像自动取款机的话
  • 一根你想永远活下去的线
请给我深刻的解释,不要像‘我猜’:)

你可能会问,新线程在做什么生意?这就是为什么我想要一些一般规则,它可能会有所不同

谢谢

为了最好的表现

您应该从这些选项中选择,不是因为性能,而是因为它们提供的设施

在这些选项中,
BackgroundWorker
拥有最好的设施

  • 它直接支持协作线程取消()
  • 它支持将更新推送到UI的界面
  • 它支持自动线程池。
    这可以提高性能,因为系统不必生成新线程来满足您的请求,而是从现有线程池中进行分配
其他两个选项没有内置的那么好的设施。在一个实现良好的UI应用程序中,您必须自己构建它们,我认为大多数人在性能方面不会比
BackgroundWorker
的实现做得更好,而不需要做很多工作

<>你可能也想考虑一下。它支持取消、更直接地集成到语言中、链式和依赖性任务以及其他有趣的功能

[来自评论:]我不担心-我只是想知道区别

是所有这些的原始构造。它在.Net中提供基本的线程支持。这是低水平的,应该避免,除非你没有更好的选择,适合你的需要

是一个允许用户创建基于任务的线程库的钩子。有人可以向该库传递一个委托,或者该库可以存储一个委托列表。它将从这些线程中调用
BeginInvoke
,以生成线程。这些线程是从线程池分配的。这是一个构建块,尽管它的级别高于
Thread
。您可能希望使用更高级别的设施

是这些选项中用户最友好的。它对于UI(GUI或命令行)应用程序最有用,在这些应用程序中,您希望向用户提供有关特定后台任务状态的反馈。它还支持协作取消。这两种情况都非常普遍

还有一些你没有提到的设施,比如任务并行库。这些都适用于其他任务,值得一看和考虑

请给我深刻的解释,不要像‘我猜’:)

人们无法猜测他们无法运行的代码的性能。作为线程性能的一般规则,您可能不应该关心它,除非您正在编写一个处理器非常密集的算法。然后,您通常应该关心您的算法,并在担心诸如线程功能的性能之类的低级细节之前完成它

您应该明确地分析代码,以确定代码库中的瓶颈,并查看是否可以改进它们。不能使用一组编程规则抢占分析

从数据库获取数据以控制或系列后台计算


DB fetch是IO绑定的,而不是CPU绑定的。在这种情况下,您正在线程化以等待后台任务,而不是线程化以最大限度地提高CPU使用率。在这种情况下,不要担心AD性能。

您能说得更具体些吗?你真是撒网了。为什么几乎每句话都以感叹号结尾呢?如果有人有这个技能,他们可以给我一个大致的答案!你可以用谷歌搜索你知道的一般答案……谷歌没有给我答案,这是我想了很长时间的事情,请友善一点:)我不担心——我只是想知道区别!(在某些情况下,它的处理器密集型算法)@Niklas:它会产生多个子任务吗?如果是这样,那么我可能会查看任务并行库,尤其是
parallel.ForEach
。但是主任务线程本身可能仍然使用
BackgroundWorker
@Niklas:“在某些情况下,它的处理器非常密集”与您最初问题中的任何场景都不匹配。您可能希望澄清需要线程执行哪种类型的CPU绑定活动,并提及您对代码的并行性所做的分析类型。看见在完成分析并最大化/切换算法以最大化并行性之前,线程池或线程生成代码的性能将是一个没有意义的问题。在大多数情况下,它可能不会像你想象的那样产生太大的影响。我现在知道我的问题太广泛了,当我有一个更具体的例子时,我会再问一次。非常感谢。