2010-02-16 3 views

Répondre

2

À moins que le fil ait commencé, vous pouvez utiliser la réflexion, mais l'utilité d'une telle chose est très douteuse. Pourquoi ne pas créer une autre instance de fil à la place:

var thread = new Thread(Method1); 
thread 
    .GetType() 
    .GetMethod("SetStartHelper", BindingFlags.Instance | BindingFlags.NonPublic) 
    .Invoke(thread, new object[] { new ThreadStart(Method2), 0 }); 
thread.Start(); 
+0

Notez que si cela est appelé après que le fil est commencé, cela ne avoir un effet –

+0

Oui, c'est pourquoi j'ai commencé ma réponse avec 'Sauf si le fil a commencé ...'. –

1

À moins que vous faites des choses étranges avec l'API de débogage ou d'hébergement du CLR et de jouer avec les internes, il n'y a aucun moyen d'un fil peut être « réaffecté » à une nouvelle méthode que cela impliquerait de manipuler la pile du fil.

Ce que vous pouvez faire est d'utiliser un modèle de commande sur votre fil pour l'envoyer travailler « charges utiles » qui pourrait changer dans le temps:

 Action worker=null; 
     bool running = true; 
     var t = new Thread(() => 
          { 
           while(running) 
           { 
            Action theWorker = worker; 
            if(theWorker!=null) 
            { 
             theWorker();  
            } 
            Thread.Sleep(10); 
           } 
          }); 
     worker = new Action(() => Console.WriteLine("hi mum")); 

     t.Start(); 
     Thread.Sleep(100); 
     worker=new Action(()=>Console.WriteLine("I can see my house from here")); 
     Thread.Sleep(100); 
     running = false; 
Questions connexes