繁体   English   中英

多线程设计

[英]Multithreaded Design

我设计多线程应用程序的经验有限,希望能就以下简单问题获得一些一般性建议:

应用程序与一组网络设备进行通信。 它必须定期根据需要在每台设备上执行维护任务。 以前它通过在每个设备上按顺序调用一个方法来完成此操作。 但是,这现在花费的时间太长,因此必须对其进行修改以异步调用每个设备上的方法。

我最初的想法是它需要异步调用每个设备的方法,有一个回调设置一个表示方法完成的变量,同时循环这些变量,直到它们都表示它们对应的方法完成,所以整个过程可以返回完成。

仅供参考,我正在 C# 中编程。 我有高水平的知识,但很少有 ThreadStart、ThreadPool 等方面的经验。

如果您使用的是 .NET 4.0,您可能需要查看以下内容:

并行编程的一般介绍

Parallel.ForEach

在不深入研究线程如何影响您的代码以及它在单处理器和多处理器机器上的行为方式的情况下,您有几种选择:

1) 经典的 Thread class,接受委托来履行职责。 首选用于不一定需要状态更新的冗长任务。

2)您可以使用BackgroundWorkers ,它公开 state 事件。 他们使用 .NET ThreadPool

3) 您可以使用BeginInvoke自己调用您的委托,它将在 .NET ThreadPool 线程上运行其任务,并允许您指定在任务完成时运行的回调

4)您可以使用新的和漂亮的任务并行库,以非常优雅的方式为您提供所需的一切

请记住,如果您希望“并行”执行的那些任务共享任何 state,则必须使用 lock 语句序列化对其的访问(存在其他方法,具体取决于要求)。 谨防死锁!

从这里开始 - 看看Parralel.For

您可以使用作业计数、作业锁定和关闭标志。 去关机:

  1. 获取作业锁定。
  2. 如果作业计数为零,请关闭。
  3. 设置关机标志。
  4. 释放锁。

要分配作业:

  1. 获取作业锁定。
  2. 增加作业计数。
  3. 释放锁。

完成工作后:

  1. 获取作业锁
  2. 减少作业计数。
  3. 如果计数不为零,则释放锁并返回。
  4. 如果关闭标志被清除,则释放锁定并返回。
  5. 关闭。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM