2010-09-08 5 views
0

Dans l'exemple de code ci-dessous, j'utilise la fonction lambda pour que 3 threads fassent des choses différentes. Mon but est de rendre le nombre de threads configurable, donc je pensais utiliser une boucle pour démarrer les threads. Mais j'ai toujours l'erreur in static function can't call non-static members. La communauté peut-elle m'aider ou me diriger vers un tutoriel? Merci beaucoup!C# utiliser la boucle pour démarrer les threads et passer les paramètres

Mon code:

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(); 
    } 
} 

look désiré:

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 
} 
+0

Voulez-vous dire que votre «code actuel» fonctionne, mais pas le «code désiré»? –

+0

Mon code actuel fonctionne bien, mais il est moche. Le code désiré est juste un pseudo-code approximatif. J'ai essayé plusieurs façons de le réaliser mais je n'ai pas réussi à le faire fonctionner. – Stan

+0

Avez-vous déclaré "func" et "myData" statiques? – Peter

Répondre

4

Le message d'erreur semble indiquer que vous tentez d'utiliser un membre d'une instance d'une méthode statique quelque part. Naturellement, cela n'est pas autorisé car une méthode statique n'a pas de référence this. Voici comment je refactoriserais votre code.

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); 
} 

Je dois cependant mentionner que créer de nouveaux threads dans une boucle non bornée est généralement indésirable. Si la boucle a une limite serrée alors peut-être, mais je devrais avoir une meilleure compréhension du problème avant de faire d'autres commentaires concernant ce point.

+0

Merci beaucoup, cela fonctionne pour moi. J'ai oublié de capturer la variable de boucle. C'est le but. – Stan

+0

@Stan: Il y a eu un débat pour savoir si C# devrait générer un avertissement lorsque vous essayez de capturer la variable de boucle comme le fait VB. Cela clarifierait certainement une partie de la confusion. –

Questions connexes