2010-07-20 2 views
8

Le titre le dit à peu près. J'ai quelques méthodes qui doivent fonctionner sur un nouveau thread et puisque tout le code avant de créer le thread est à peu près le même, j'ai pensé que je créerais une fonction qui pourrait prendre comme paramètre l'action que j'ai besoin d'invoquer.Comment créer un nouveau thread pour exécuter une action <T>

Le problème est, je n'ai pas trouvé comment dire le fil dont il a besoin pour exécuter l'action. Est-ce que c'est possible? Voici un petit exemple de code de ce que j'essaie de faire.

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

Cordialement,
seba

+0

La pile n'est pas plus grande. Il est en fait plus petit sur x64. –

+0

Ce code s'exécute sur IIS 7 :) – sebagomez

Répondre

7

Quelque chose comme cela devrait faire l'affaire:

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

Essayez d'utiliser Action<object> puis jeté à Helper dans le corps d'action

8

I wouldn même pas la peine de ParameterizedThreadStart. Laissez le compilateur faire le sale boulot:

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

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

Bien sûr, vous pourriez réaliser un peu plus loin et changer la signature:

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

Ou une version plus générique de la méthode ....

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