2011-08-13 70 views
0

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

的应用程序与网络设备的集合通信。定期和按需,它必须在每个设备上执行维护任务。以前它通过依次调用每个设备上的方法来完成此操作。然而,这现在花费的时间太长,所以必须修改它以异步调用每个设备上的方法。

我最初的想法是,它需要异步调用每个设备的方法,有一个回调设置一个变量,指出该方法已完成,并在此期间循环这些变量,直到它们都指示它们的相应方法是完整的,所以整个过程可以完整地返回。

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

+1

你使用什么版本的.Net? – svick

+0

您确实在寻找异步行为,或者您希望所有设备在同一时间运行,即并行\并发。 –

+0

使用.NET 3.5。 问题在于速度,并且一次只能在一个设备上操作需要很长时间。这些设备不必完全在同一时间运行 - 不确定异步/并行/并行的哪一项适用于此。 谢谢 – Ronnie

回答

0

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

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

要分配工作:

  1. 获得工作锁定。
  2. 递增作业计数。
  3. 解锁。

当工作完成:

  1. 采集工作锁定
  2. 递减的作业计数。
  3. 如果计数不为零,则释放锁定并返回。
  4. 如果关闭标志清除,请释放锁定并返回。
  5. 关机。
1

没有挖进过多的线程如何影响你的代码,它是如何在单VS多处理器计算机引擎盖下的行为,你有几种选择:

1)经典的Thread类,它接受代表履行职责。对于不一定需要状态更新的冗长任务来说,这是首选。

2)您可以使用BackgroundWorkers,它公开状态事件。他们使用.NET线程池

3)你可以通过你自己用BeginInvoke,这将在.NET线程池线程上运行的任务,并允许你指定一个回调的任务完成后,要运行调用您的代表

4)可以使用新的&不错Task Parallel Library,为您提供你一个非常优雅的时尚需要

请记住,如果你想“并行”执行这些任务共享任何国家的一切,你必须使用串行访问该锁定语句(其他方法存在,取决于要求)。谨防僵局!