C#using循环启动线程并传递参数

时间:2010-09-08 01:45:36

标签: c# multithreading

在下面的示例代码中,我使用lambda函数使3个线程执行不同的操作。我的目标是使线程计数可配置,所以我在考虑使用循环来启动线程。但我总是遇到in static function can't call non-static members错误。社区可以帮助我或指导我阅读教程吗?非常感谢!

我的代码:

internal class FeedClient
{
    private static void Main(string[] args)
    {
        int iteration = 10;
        int ranSleepTime = 1000;
        var obj = new MyClass();

        var threads = new Thread[3];

        (threads[0] = new Thread(() =>
                                     {
                                         Random random = new System.Random();
                                         for (int i = 0; i < iteration; i++)
                                         {
                                             obj.MyMethod("my string 1");
                                             Thread.Sleep(random.Next(ranSleepTime));
                                         }
                                     })).Start();

        (threads[1] = new Thread(() =>
                                     {
                                         Random random = new System.Random();
                                         for (int i = 0; i < iteration; i++)
                                         {
                                             obj.MyMethod("my string 2");
                                             Thread.Sleep(random.Next(ranSleepTime));
                                         }
                                     })).Start();

        (threads[2] = new Thread(() =>
                                     {
                                         Random random = new System.Random();
                                         for (int i = 0; i < iteration; i++)
                                         {
                                             obj.MyMethod("my string 3");
                                             Thread.Sleep(random.Next(ranSleepTime));
                                         }
                                     })).Start();

        foreach (Thread thread in threads)
        {
            thread.Join();
        }

        obj.Close(false);

        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}

期望的样子:

for(int i=0;i<3;i++){
    threads[i] = new Thread(func); // func is the lambda function
    threads[i].Start(myData[i]); // myData[] may be a string array
}

1 个答案:

答案 0 :(得分:4)

错误消息似乎表明您正在尝试在某处使用静态方法中的实例成员。当然,这是不允许的,因为静态方法没有this引用。以下是我重构代码的方法。

public static void Main()
{
  string[] myData = GetStringArray();
  int iteration = 10;   
  int ranSleepTime = 1000;   
  var obj = new MyClass();   
  var threads = new Thread[myData.Length];

  for (int i = 0; i < threads.Length; i++)
  {
    int captured = i; // This is required to avoid capturing the loop variable.
    threads[i] = new Thread(
      () =>
      {
        var random = new Random(); 
        for (int i = 0; i < iteration; i++) 
        { 
          obj.MyMethod(myData[captured]); 
          Thread.Sleep(random.Next(ranSleepTime)); 
        } 
      });
    threads[i].Start();
  }

  foreach (Thread thread in threads)
  {
    thread.Join();
  }

  obj.Close(false);
}
但是,我必须提到,在无界循环中创建新线程通常是不合需要的。如果循环有一个紧密的界限,那么可能,但在对这一点做出任何进一步的评论之前,我必须更好地理解这个问题。