2009-04-18 17 views
0

Ich bin ein bisschen neu zu ThreadPool in .NET. Ich frage mich, ob ich, wenn ich nur ein Objekt an meine Rückrufmethode senden kann, auf die Klassenmitgliedsvariable zugreifen kann, um ihre Methoden aufzurufen? (Siehe customClass in CallBack())Wie man mit ThreadPool und Mitgliedsvariablen umgehen?

Und wie würde ich die Daten von customClass laden? Übergeben Sie die customClass an eine andere CallBack-Methode? Ist dieser Ansatz in Ordnung?

Wie Sie sehen können, ist es ein bisschen mangelnde Erfahrung, so dass alle Tipps auf dem Weg wirklich geschätzt werden würden.

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

Antwort

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

Schöne Probe, aber die Aufruf an SaveData sollte eigentlich SaveData (Text) sein - nur ein Copy/Paste-Rest, natürlich ;-) –

+0

wow, sehr schönes Beispiel! Mit .NET 3.5 müssen keine CallBack-Methoden mehr mit Objekt als Parameter verwendet werden. Ist das korrekt? Ich würde auch eine .NET 2.0-Lösung für dieses Problem sehr schätzen, also kenne ich beide Wege. Irgendeine Idee? – Houman

+0

Hatte einfach eine Idee, wäre das der Weg, wie es in der .NET 2.0 Welt gemacht wird? ThreadPool.QueueUserWorkItem (Delegat {CallBack (customClass, "Welt");}); – Houman

1

Der einfachste Weg, dies zu tun, ist ein closure zu verwenden, um alle Variablen zu erfassen Sie (das heißt ein anonymes Verfahren oder einen Lambda-Ausdruck verwendet) mögen. Sie müssen sich über genau aufpassen, was gefangen ist, wenn Sie eine Schleife verwenden, aber es ist handlicher als durch ein Objekt vorbei und es wieder nach rechts Typ usw.

+0

Um zu klären, ist der Grund, warum die Pflege in Schleifen mit Schließung genommen werden muss, in dieser Frage angesprochen: http://stackoverflow.com/questions/271440/c-captured-variable-in-loop –

1

Zusätzlich zu dem, was war zu werfen, die sagte: Wenn CustomClass unter Kontrolle ist und Fall eine gemeinsame Verwendung asynchron SaveData Aufrufen Sie Bereitstellen eines SaveDataAsync Methode einfiel:

class CustomClass { 

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

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

the Event-based Asynchronous Pattern See.

+0

Das ist ein sehr schöner Tipp. Vielen Dank. – Houman

Verwandte Themen