从另一个线程调用时不触发操作

时间:2018-07-31 11:17:58

标签: c# multithreading threadpool

在我的应用中,我正在运行一种方法,该方法需要几秒钟的时间才能运行,并且我需要使用不同的参数多次触发该方法以实现所需的功能。后来我开始遇到性能问题,并决定在多个线程中执行这些操作以减少运行时间。我按预期实现了所有操作,但是当触发该线程时,它就冻结了。它说线程正在运行,但从未完成。我以为我在线程中调用的方法可能锁定了同一对象,这导致线程冻结,但似乎并不是问题所在。

这是示例代码:

 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。

任何想法为什么它不能运行通过列表传递的动作?

0 个答案:

没有答案