有1个线程同时执行多个方法

问题描述 投票:0回答:2

所以我有一个包含 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 上弹出,并在到达目的地时消失。所有火车在地图上同时移动。

如果我需要发布更多我尝试过的代码,请告诉我。 预先感谢!

c# .net multithreading parallel-processing task-parallel-library
2个回答
2
投票

您要找的是

Parallel.ForEach
:

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

你这样使用它:

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

0
投票

回复晚了。不可能同时运行这么多线程。通常是通过将所有对象放入一个数组并循环遍历该数组来完成的:

  1. 拉取对象的状态
  2. 计算该对象现在应该在哪里(这是您希望在每个对象上运行的方法,但它不能从头到尾运行。您必须更新它。它采用对象的最后状态,并且计算当前状态)
  3. 相应地保存其状态
  4. 从数组中刷新场景
  5. 移至列表中的下一个对象
  6. 列表结束?回到第一个对象。
© www.soinside.com 2019 - 2024. All rights reserved.