2010-07-20 6 views
8

Il titolo lo dice molto. Ho alcuni metodi che devono essere eseguiti su un nuovo thread e poiché tutto il codice prima di creare il thread è praticamente lo stesso, ho pensato di creare una funzione che potesse assumere come parametro l'azione che ho bisogno di richiamare.Come creare una nuova discussione per eseguire un'azione <T>

Il problema è che non ho trovato il modo di dire al thread che è necessario eseguire l'azione. È possibile? Ecco un piccolo esempio di codice di ciò che sto cercando di fare.

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

saluti,
SEBA

+0

Lo stack non è più grande. In realtà è più piccolo su x64. –

+0

Questo codice viene eseguito su IIS 7 :) – sebagomez

risposta

7

Qualcosa di simile dovrebbe fare il trucco:

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

Prova utilizzando Action<object> e poi gettati a Helper nel corpo della azione

8

I wouldn Basta preoccuparsi di ParameterizedThreadStart. Lasciate che il compilatore fare il lavoro sporco:

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

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

Naturalmente, si potrebbe portare questo un ulteriore passo avanti e cambiare la firma:

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

o una versione più generica del metodo ....

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