多线程设计

时间:2011-08-13 15:49:34

标签: c# multithreading

我在设计多线程应用程序方面经验有限,并希望就以下简单问题提供一些一般性建议:

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

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

仅供参考我是用C#编程的。我有高水平的知识,但很少有ThreadStart,ThreadPool等经验。

4 个答案:

答案 0 :(得分:2)

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

General intro to parallel programming

Parallel.ForEach

答案 1 :(得分:1)

如果没有深入研究线程如何影响您的代码以及它在单处理器和多处理器机器上的表现如何,您有几种选择:

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

2)您可以使用公开状态事件的BackgroundWorkers。他们使用.NET ThreadPool

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

4)你可以使用新的&不错的{{3}},以非常优雅的方式为您提供所需的一切

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

答案 2 :(得分:0)

从这里写的 - 看看Parralel.For

答案 3 :(得分:0)

您可以使用作业计数,作业锁定和关闭标记。关闭:

  1. 获取工作锁。
  2. 如果作业计数为零,请关闭。
  3. 设置关闭标志。
  4. 解锁。
  5. 分配工作:

    1. 获取工作锁。
    2. 增加工作次数。
    3. 解锁。
    4. 完成工作后:

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