在我的应用中,我正在运行一种方法,该方法需要几秒钟的时间才能运行,并且我需要使用不同的参数多次触发该方法以实现所需的功能。后来我开始遇到性能问题,并决定在多个线程中执行这些操作以减少运行时间。我按预期实现了所有操作,但是当触发该线程时,它就冻结了。它说线程正在运行,但从未完成。我以为我在线程中调用的方法可能锁定了同一对象,这导致线程冻结,但似乎并不是问题所在。
这是示例代码:
public abstract class ModelBase
{
public static void RunInMultiThread(List<Action> actions)
{
Action testAction = new Action(() =>
{
Console.WriteLine("Other test");
});
List<Thread> threads = new List<Thread>();
foreach (Action action in actions)
{
ThreadStart dlg = () => { action(); };
Thread thread = new Thread(dlg);
thread.Start();
threads.Add(thread);
}
bool anyAlive = true;
while (anyAlive)
{
anyAlive = threads.Any(t => t.IsAlive);
}
}
}
/// <summary>
/// This class is autogenerated
/// </summary>
public class Model : ModelBase
{
public void FireActions()
{
List<Action> actions = new List<Action>();
for (int i = 1; i <= 100; i++)
{
Action action = new Action(() => { DoSomething(i); });
actions.Add(action);
}
RunInMultiThread(actions);
}
public void DoSomething(int a)
{
Console.WriteLine("Test " + a);
}
}
我正在创建Model类的新实例,并调用FireActions
方法。我可以在RunInMultiThread()
方法中看到线程列表,它说所有任务都在运行。我在输出中看不到任何东西。
为了简化起见,我将testAction
动作传递给了ThreadStart
并成功了。我很惊讶,如果我通过列表中的操作,为什么它不起作用?
注意:Model
类实际上是自动生成的,位于另一个库上,并且.NET版本是4.0。该库是使用System.CodeDom.Compiler
构建的。 ModelBase
类在另一个项目上,并且.NET版本为4.7.1。
任何想法为什么它不能运行通过列表传递的动作?