2011-03-17 50 views
13

你什么时候在应用程序中使用线程?例如,在简单的CRUD操作中,使用smtp,调用web服务,如果服务器正面临带宽问题,可能需要几次时间等。何时使用多线程?

说实话,我不知道如何确定是否需要使用一个线程(我知道它必须是当我们除了一个操作需要花费几个时间来完成)。

这可能是一个“noob”问题,但如果您与我分享您在线程中的经验,那将会非常棒。

感谢

+0

你究竟在做什么。我们可能更容易告诉您线程是否有助于解决您的问题。否则,这个问题看起来像是一个“接近不是真正的问题”的候选人。 – 2011-03-17 23:39:23

+0

我需要为我的下一个客户研究多线程的使用,因为我的团队负责人问了这个问题。但首先我想弄清楚什么时候应该使用线程,这就是为什么我问这个问题。查看其他开发人员何时在“真实世界应用程序”中使用线程。 – 2011-03-17 23:44:35

+0

我喜欢从资源的角度来看待多线程场景。换句话说,UI(图形),网络,磁盘IO,CPU(核心),RAM等等。我发现,至少在决定何处使用多线程时有帮助。伟大的问题btw。 noob或其他:-) – bic 2011-03-17 23:44:50

回答

7

我添加了C#和。NET标签到你的问题,因为你在标题中提到C#。如果这不正确,请随时删除标签。

有多种不同风格的多线程。例如,有回调函数的异步操作。 .NET 4引入了并行Linq库。您将使用多线程的风格,还是根本不使用它,取决于您尝试完成的内容。

并行执行,诸如什么并行LINQ一般将试图做,利用执行不需要等待来自对方数据指令的多个处理器核。 Linq以外的算法有很多来源,例如this。但是,并行执行可能无法执行,或者它不适合您的应用程序。

更多传统多线程利用螺纹的.NET库(在这种情况下)内,通过提供System.Thread。请记住,在线程上启动进程会有一些开销,所以只有在线程优势超过此开销时才使用线程。一般而言,只有在线程下运行的任务长时间处于空闲状态时,才会使用此类单处理器多线程。例如,来自硬盘的I/O(以及因此来自使用一个数据库系统的数据库系统)的I/O比内存访问慢许多个数量级。作为另一个例子,网络访问也可能很慢。多线程可以允许另一个进程在等待这些较慢(与处理器相比)操作完成时运行。

当我用传统的多线程的另一个例子是缓存在第一时间特定的ASP.NET页面在会话中访问某些值。我启动了一个线程,以便用户在与页面交互之前不必等待缓存完成。我还规定了在用户请求另一个页面之前缓存未完成时的行为,以便在缓存未完成时,这不是问题。它只是简化了一些以前太慢的请求。

此外还应考虑到多线程有你的应用程序的可维护性成本。例如,螺纹应用程序可能比较难以调试。

我希望这至少在某种程度上回答你的问题。

+0

所以用.net并行编程封装多线程?这是否正确申明? – RollRoll 2012-09-13 00:33:48

+0

@EdwinSnts我不完全确定你在问什么。多个线程,无论是由Linq还是其他方式创建,都可以运行在不同的处理器内核上。这是你的意思吗? – Andrew 2012-09-14 06:20:06

+0

是否意味着如果我不使用并行linq,我的代码中的指令将只在一个内核中执行?即使托管它的计算机具有多核处理器? – RollRoll 2012-09-14 13:36:45

0

一个原因使用线程是跨越多个的CPU /内核的分账大片,CPU密集型任务,以更快地完成。另一种方法是让扩展任务异步执行,因此前台可以在运行时保持响应。

你的例子似乎集中在其中的第二个。虽然这可能是一个很好的理由,但如果您可以使用异步I/O,那通常更可取(例如,几乎所有使用套接字的东西都可以/更好地异步使用套接字)。异步I/O更容易取消,并且通常也会有较低的CPU开销。

1

当您需要不同的执行路径时,您可以使用线程。这会导致(如果正确完成)更响应和/或更快的应用程序,但也会导致更复杂的代码和调试。

在一个简单的CRUD场景中,可能没有那么有用,但也许你的UI正在使用一个缓慢的Web服务。如果你的代码绑定到你的UI线程,你将在服务调用之间有没有响应的UI。

在这种情况下,使用System.Threading.Threads可能会矫枉过正,因为您不需要太多的控制。使用BackgrounWorker可能是更好的选择。

线程是很难掌握的东西,但正确使用的好处是巨大的,性能是最常见的。

0

不知何故,你自己回答了你的问题。每当执行耗时的操作时使用线程是正确的选择。当你想让事情变得更快的时候,你也应该这样做。例如,你想处理一些文件 - 每个文件可以由不同的线程处理。

通过使用线程,您可以更好地利用多核/处理器机器的功耗。

在您的应用程序的后台监控一些数据。

有几十个这样的场景。

1

约瑟夫阿尔巴哈利总结得很好here

  • 维护响应用户界面
  • 有效利用原本阻塞CPU
  • 并行编程
  • 预测执行
  • 允许请求的同时处理
+0

@Jerry Coffin - 你的观点非常好。已应用编辑。 – 2011-03-18 00:05:41

0

实现我的评论可能足以作为一个答案......

我喜欢从资源角度看待多线程场景。换句话说,UI(图形),网络,磁盘IO,CPU(核心),RAM等等。我发现,至少在决定何处使用多线程时有帮助。

这背后的原因很简单,我可以同时在同一时间使用另一个线程来完成别的东西使用不同的资源在一个特定的线程(例如磁盘IO)取一个资源的优势。