【问题标题】:Having 1 thread execute multiple methods at the same time让 1 个线程同时执行多个方法
【发布时间】:2015-01-11 13:17:30
【问题描述】:

所以我有一个包含 900 多个 C# 条目的列表。对于列表中的每个条目,都必须执行一个方法,尽管这些方法必须同时执行。首先我想到了这样做:

public void InitializeThread()
{
   Thread myThread = new Thread(run());
   myThread.Start();
}

public void run()
{
   foreach(Object o in ObjectList)
   {
      othermethod();
   }
}

现在的问题是,这将为列表中的每个条目一次执行 1 个方法。但我希望它们中的每一个都同时运行。

然后我尝试为每个条目创建一个单独的线程,如下所示:

public void InitializeThread()
{
   foreach(Object o in ObjectList)
   {
      Thread myThread = new Thread(run());
      myThread.Start();
   }
}

public void run()
{
   while(//thread is allowed to run)
   {
      // do stuff
   } 
} 

但这似乎给了我 system.outofmemory 异常(这并不奇怪,因为该列表有近 1000 个条目。 有没有办法同时成功运行所有这些方法?使用多个线程还是只使用一个?

我最终想要实现的是:我有一个 GMap,并希望在其上添加一些标记。这些标记代表火车。标记会在某个时间点在 GMap 上弹出,并在到达目的地时消失。所有火车在地图上同时移动。

如果我需要发布更多我尝试过的代码,请告诉我。 提前致谢!

【问题讨论】:

  • 每次方法运行时都会改变几个变量,然后在 GMap Overlay 上放置一个标记。
  • 无法保证所有方法都同时运行。即使您执行超过 9000 个线程 - 操作系统也可能会一一执行。顺便说一句Parallel.ForEach 是最简单的方法
  • 既然你提到了这一点,我很确定我可以。您必须单独将每个标记添加到叠加层中,然后您可以一次性将该叠加层添加到地图中。
  • 哦,但这意味着我可以让程序一个接一个地更改变量,然后每次都使用一个线程将叠加层添加到地图中,从而只使用一个线程对吗?
  • 您需要修正您的问题,使其有意义。一台计算机实际上只能“同时”做与它所支持的硬件一样多的事情。对于执行程序语句,所需的硬件是 CPU 内核,因此“同时”执行的方法永远不会多于 CPU 内核。所以要么你在寻求不可能的事,要么你真的想要一些你真正想要的东西。请解决问题,以便我们了解您真正想要实现的目标。

标签: c# .net multithreading parallel-processing task-parallel-library


【解决方案1】:

你要找的是Parallel.ForEach:

在 IEnumerable 上执行 foreach 操作,其中迭代可能 并行运行。

你可以这样使用它:

Parallel.ForEach(ObjectList, (obj) =>
{
   // Do parallel work here on each object
});

【讨论】:

  • 这并不能保证所有项目同时运行(就像我们想要的问题一样),不是吗?它将根据执行代码的机器尽可能多地同时运行它们。我会说这是正确的答案,但可能值得指出。
  • “同时运行所有项目” 始终是您的机器正在运行的核心数量的一个因素。 Parellel.ForEach 将尝试根据可用的底层资源对 IEnumerable 进行分区。
  • 感谢您的回复,我会试试这个,有结果我会回复的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多