2009-04-18 11 views
0

Je suis un peu nouveau pour ThreadPool dans .NET. Je me demandais, si je ne peux envoyer qu'un seul objet à ma méthode de rappel, comment puis-je accéder à la variable membre de la classe pour appeler ses méthodes? (voir customClass dans CallBack())Comment gérer ThreadPool et les variables membres?

Et comment charger les données de customClass? Dois-je passer la customClass à une autre méthode CallBack? cette approche est-elle correcte?

Comme vous pouvez le voir, c'est un peu manque d'expérience, donc des conseils sur le chemin seraient vraiment appréciés.

Merci, Kave

class Program 
      { 
       static void Main(string[] args) 
       { 
        CustomClass customClass = new CustomClass(); 

       ThreadPool.QueueUserWorkItem(CallBack, "Hello"); 


       Console.Read(); 
      } 

      private static void CallBack(object state) 
      { 
       customClass.SaveData(state.ToString()); 
      } 
     } 

Répondre

2
class Program 
{ 
    static void Main(string[] args) 
    { 
    CustomClass customClass = new CustomClass(); 
    ThreadPool.QueueUserWorkItem(x => CallBack(customClass, "Hello")); 
    Console.Read(); 
    } 

    private static void CallBack(CustomClass custom, string text) 
    { 
    customClass.SaveData(text); 
    } 
} 
+0

Bon échantillon, mais le appel à SaveData devrait vraiment être SaveData (texte) - juste un copier/coller des restes, évidemment ;-) –

+0

wow très bel exemple! Avec .NET 3.5, les méthodes CallBack n'ont plus besoin d'avoir un objet comme paramètre. Est-ce correct? J'apprécierais également fortement une solution de .NET 2.0 à ce problème, ainsi je connais les deux manières. Une idée? – Houman

+0

Juste eu une idée, serait-ce la façon dont il est fait dans le monde .NET 2.0? ThreadPool.QueueUserWorkItem (délégué {CallBack (customClass, "World");}); – Houman

1

La meilleure façon de le faire est d'utiliser un closure pour capturer toutes les variables que vous voulez (à savoir utiliser une méthode anonyme ou une expression lambda). Vous devez faire attention à exactement ce qui capturé si vous utilisez une boucle, mais il est plus pratique que de passer à travers un objet et d'avoir à jeter de nouveau le type droit, etc.

+0

Pour clarifier, la raison pour laquelle des précautions doivent être prises dans les boucles avec fermeture est abordée dans cette question: http://stackoverflow.com/questions/271440/c-captured-variable-in-loop –

1

En plus de ce qui a été dit: Si CustomClass est sous votre contrôle et invoquer de manière asynchrone SaveData est un cas d'utilisation commune, vous pourriez penser à fournir une méthode SaveDataAsync:

class CustomClass { 

    public void SaveDataAsync(string path) { 
     ThreadPool.QueueUserWorkItem(state => this.SaveData(path)); 
    } 

    public void SaveData(string path) { 
     ... 
    } 
} 

Voir the Event-based Asynchronous Pattern.

+0

C'est un très bon conseil. Merci beaucoup. – Houman

Questions connexes