Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多线程设计_C#_Multithreading - Fatal编程技术网

C# 多线程设计

C# 多线程设计,c#,multithreading,C#,Multithreading,我设计多线程应用程序的经验有限,希望能就以下简单问题提供一些一般性建议: 应用程序与一组网络设备通信。它必须定期按需在每个设备上执行维护任务。以前,它是通过依次调用每个设备上的方法来实现的。但是,这现在花费的时间太长,因此必须对其进行修改,以便在每个设备上异步调用该方法 我最初的想法是,它需要异步调用每个设备的方法,让回调函数设置一个表示方法已完成的变量,同时循环遍历这些变量,直到它们都表示其对应的方法已完成,这样整个过程可以作为完成返回 仅供参考,我正在用C语言编程。我拥有高级知识,但对Thr

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

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

我最初的想法是,它需要异步调用每个设备的方法,让回调函数设置一个表示方法已完成的变量,同时循环遍历这些变量,直到它们都表示其对应的方法已完成,这样整个过程可以作为完成返回


仅供参考,我正在用C语言编程。我拥有高级知识,但对ThreadStart、ThreadPool等方面的经验很少。

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


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


从这里开始-查看从这里开始-查看您可以使用作业计数、作业锁定和关闭标志。要关闭:

  • 获取工作锁
  • 如果作业计数为零,请关闭
  • 设置关机标志
  • 松开锁
  • 分配工作:

  • 获取工作锁
  • 增加作业计数
  • 松开锁
  • 完成作业后:

  • 获得工作锁
  • 减少作业计数
  • 如果计数不为零,则释放锁并返回
  • 如果关闭标志清除,释放锁并返回
  • 关闭

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

  • 获取工作锁
  • 如果作业计数为零,请关闭
  • 设置关机标志
  • 松开锁
  • 分配工作:

  • 获取工作锁
  • 增加作业计数
  • 松开锁
  • 完成作业后:

  • 获得工作锁
  • 减少作业计数
  • 如果计数不为零,则释放锁并返回
  • 如果关闭标志清除,释放锁并返回
  • 关闭

  • 如果不深入研究线程如何影响代码,以及在单处理器与多处理器机器上,代码在引擎盖下的行为,您可以选择以下几种方式:

    1) 经典的Thread类,它接受委托来执行其职责。对于不一定需要状态更新的冗长任务,首选此选项

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

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

    4) 您可以使用new&nice,以非常优雅的方式为您提供所需的一切


    请记住,如果希望“并行”执行的任务共享任何状态,则必须使用lock语句序列化对该状态的访问(根据需要,还存在其他方法)。当心死锁

    如果不深入研究线程如何影响代码,以及在单处理器与多处理器机器上,代码在引擎盖下的行为,您可以选择以下几种方式:

    1) 经典的Thread类,它接受委托来执行其职责。对于不一定需要状态更新的冗长任务,首选此选项

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

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

    4) 您可以使用new&nice,以非常优雅的方式为您提供所需的一切


    请记住,如果希望“并行”执行的任务共享任何状态,则必须使用lock语句序列化对该状态的访问(根据需要,还存在其他方法)。当心死锁

    您使用的是什么版本的.Net?您是真的在寻找异步行为,还是希望所有设备同时运行,即并行\并发地使用.Net 3.5。问题在于速度,一次操作一台设备需要的时间太长。这些设备不必在完全相同的时间运行——不确定异步/并行/并发哪个术语在这里适用得最好。感谢您使用的.Net版本是什么?您真的在寻找异步行为,还是希望使用.Net 3.5同时操作所有设备,即并行\并发。问题在于速度,一次操作一台设备需要的时间太长。这些设备不必在完全相同的时间运行——不确定异步/并行/并发哪个术语在这里适用得最好。谢谢