2010-07-20 6 views
8

Der Titel sagt es so ziemlich. Ich habe einige Methoden, die auf einem neuen Thread ausgeführt werden müssen, und da der gesamte Code vor dem Erstellen des Threads ziemlich identisch ist, dachte ich, ich würde eine Funktion erstellen, die als Parameter die Aktion nehmen kann, die ich aufrufen muss.So erstellen Sie einen neuen Thread zum Ausführen einer Aktion <T>

Problem ist, ich habe nicht gefunden, wie man dem Faden sagt, dass es die Aktion ausführen muss. Ist das überhaupt möglich? Hier ist ein kleiner Beispielcode von dem, was ich versuche zu tun.

private void ExecuteInBiggerStackThread(Action<Helper> action, Parameters parms) 
{ 
    ParameterizedThreadStart operation = new ParameterizedThreadStart(action);// here's the mess 
    Thread bigStackThread = new Thread(operation, 1024 * 1024); 

    bigStackThread.Start(parms); 
    bigStackThread.Join(); 
} 

Grüße,
seba

+0

Der Stapel ist nicht größer. Es ist tatsächlich kleiner auf x64. –

+0

Dieser Code läuft auf IIS 7 :) – sebagomez

Antwort

7

Irgendwas Aktion mit sollte den Trick tun:

private void ExecuteInBiggerStackThread(Action<Helper> action, Helper h) 
{ 
    var operation = new ParameterizedThreadStart(obj => action((Helper)obj)); 
    Thread bigStackThread = new Thread(operation, 1024 * 1024); 

    bigStackThread.Start(h); 
    bigStackThread.Join(); 
} 
0

Versuchen Action<object> und dann gegossen Helper im Körper wie diese

8

I wouldn Ärgere dich nicht einmal mit ParameterizedThreadStart. Lassen Sie den Compiler die schmutzige Arbeit tun:

private void ExecuteInBiggerStackThread(Action<Helper> action, Helper h) 
{ 
    Thread bigStackThread = new Thread(() => action(h), 1024 * 1024); 

    bigStackThread.Start(); 
    bigStackThread.Join(); 
} 

Natürlich können Sie noch einen Schritt weiter tragen konnte und die Signatur ändern:

private void ExecuteInBiggerStackThread(Action action) { ... } 
3

Oder eine generische Version des Verfahrens ....

protected void ExecuteInBiggerStackThread<T>(Action<T> action, T parameterObject) 
{ 
    var bigStackThread = new Thread(() => action(parameterObject), 1024 * 1024); 
    bigStackThread.Start(); 
    bigStackThread.Join(); 
}