【问题标题】:How to run method in separate thread如何在单独的线程中运行方法
【发布时间】:2011-03-25 13:14:42
【问题描述】:

我发现了一段非常好的代码,它在单独的线程中运行所有方法。 代码如下

private static void Method1()
{
    //Method1 implementation
}

private static void Method2()
{
    //Method2 implementation
}

private static void RunMethodInSeparateThread(Action action)
{
    var thread = new Thread(new ThreadStart(action));
    thread.Start();
}

static void Main(string[] args)
{
    RunMethodInSeparateThread(Method1);
    RunMethodInSeparateThread(Method2);
}

在这种情况下,我如何将参数传递给方法,并且可能存在 Method1 可能需要 2 个参数而 Method2 可能需要 3 个参数的情况。在这种情况下,如何以通用方式构造 RunMethodInSeparateThread,它将接受许多参数并传递给方法。请帮我写代码。谢谢

【问题讨论】:

    标签: .net c#-4.0


    【解决方案1】:

    要在另一个线程中运行一些代码,您可以这样做:

    new Thread(delegate () {
        Method1(param1, param2);
    }).Start();
    

    对于需要接受可变数量参数的方法,您可以接受参数集合或字典。或者,您可以创建允许不同数量参数的单独方法。例如:

    private static void Method1()
    {
        //Method1 implementation
    }
    
    private static void Method1(int Param1)
    {
        //Method1 implementation
    }
    
    private static void Method1(int Param1, int Param2)
    {
        //Method1 implementation
    }
    

    【讨论】:

      【解决方案2】:

      在我看来,使用 .NET 4,您的 RunMethodInSeparateThread 方法似乎有点多余。我会这样做:

      Task.Factory.StartNew(() => { Method1(param1); });
      Task.Factory.StartNew(() => { Method2(param1, param2); });
      

      【讨论】:

        【解决方案3】:

        如果 Method1 和 Method2 运行时间很短,最好的方法是不要创建新线程。您可以改用 .NET 线程池,如下所示:

        private static void Method1(int x)
        {
            //Method1 implementation
        }
        
        private static void Method2(int x, int y)
        {
            //Method2 implementation
        }
        
        public static void Main()
        {
          ThreadPool.QueueUserWorkItem(() => Method1(4));
          ThreadPool.QueueUserWorkItem(() => Metho2(13, 7));
        }
        

        【讨论】:

          【解决方案4】:
          private static void Method1(int x, int y, int c)
          {
              //Method1 implementation
          }
          
          static void Main(string[] args)
          {
              ThreadPool.QueueUserWorkItem(state => Method1(1,2,3));
          }
          

          【讨论】:

          • 啊,忘记了“状态”参数。谢谢,jgauffin。
          【解决方案5】:

          “数据槽”有用吗?请参阅http://msdn.microsoft.com/en-us/library/6sby1byh.aspx 上的“线程本地存储:线程相关的静态字段和数据槽”

          【讨论】:

            猜你喜欢
            • 2015-01-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-28
            • 1970-01-01
            • 1970-01-01
            • 2011-03-23
            • 2015-07-10
            相关资源
            最近更新 更多