2010-08-05 6 views
1

J'essaie d'obtenir un thread travaillant en C# pour réinitialiser l'heure et exécuter une autre fonction à côté de celle-ci. Le code que j'ai est:Création de threads en C#

Thread loopTime = new Thread(this.someFunction); 
loopTime.Start(); 

for (int i = 0; i < 20; i++) 
{ 
    ChangeTimeFunction(someTime); 
    Thread.Sleep(200); 
} 

Je reçois une erreur de filetage si je passe this.SomeFunction(). Cela ne peut pas être utilisé selon Visual Studio. Je pourrais avoir la boucle for comme un fil mais je ne sais pas comment passer dans la variable someTime.

Y a-t-il un moyen de transmettre la variable dans la boucle s'il s'agit d'une fonction ou d'appeler la boucle for depuis la fonction.

Merci pour toute aide.

MISE À JOUR:

someFunction est une des méthodes enregistrées en utilisant Visual Studio. Cela ne peut pas être utilisé en dehors du thread principal. Je devrais mettre la boucle for à l'intérieur du thread que je crée. Est-ce que quelqu'un sait comment faire ça?

Merci

+0

Pourriez-vous inclure le definiton de someFunction? –

Répondre

4

est-il un moyen de passer soit la variable dans la boucle si elle était une fonction ou appelez la boucle de dans la fonction.

.NET a deux délégués pour les threads de départ. Le premier est ThreadStart, qui appelle simplement une méthode sans arguments.

La seconde est ParameterizedThreadStart, qui appelle une méthode avec un seul object en tant que paramètre. C# créera implicitement un délégué ParameterizedThreadStart si vous transmettez une méthode dans le constructeur Thread qui a un argument object. Vous lui envoyez alors un object en utilisant la méthode .Start(Object) du fil.

Par exemple, pour faire la boucle d'un fil, en supposant quelque temps est un DateTime et comprenant un casting à cet effet:

Thread loopTime = new Thread(someFunction); 
loopTime.Start(someTime); 

public void someFunction(object someTime) { 
    for (int i = 0; i < 20; i++) 
    { 
     // Note the cast here... I assumed it's a DateTime 
     ChangeTimeFunction((DateTime) someTime); 
     Thread.Sleep(200); 
    } 
} 
+0

@ R. Bemrose - Le lien ParameterizedThreadStart était parfait. Merci +1 – chrissygormley

0

Cela ne ressemble pas à un problème de qualificatif "this".

Votre fonction someFunction accepte-t-elle un paramètre? Si oui, vous pouvez:

  1. Make it et parameterless transmettre des données à travers champ membre
  2. utilisation peut utiliser la fermeture pour passer variable de la portée externe.

    int i = 2; 
    Thread t = new Thread(x => 
              { 
               i++;          
              }); 
    
    t.Start();