2010-07-20 2 views
8

Название в значительной степени говорит об этом. У меня есть некоторые методы, которые нужно запускать в новом потоке, и поскольку весь код перед созданием потока почти одинаковый, я думал, что создам функцию, которая может принимать в качестве параметра действие, которое мне нужно вызвать.Как создать новую тему для выполнения действия <T>

Проблема в том, что я не нашел, как определить поток, необходимый для выполнения действия. Возможно ли это? Вот небольшой пример кода того, что я пытаюсь сделать.

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

С уважением,
SEBA

+0

Стек не больше. Это на самом деле меньше на x64. –

+0

Этот код работает на IIS 7 :) – sebagomez

ответ

7

что-то вроде этого должно сделать трюк:

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

Попробуйте использовать Action<object> и затем отливали в Helper в теле соответствующего действия

8

I Wouldn 't даже беспокоиться с ParameterizedThreadStart. Пусть компилятор делать грязную работу:

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

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

Конечно, вы могли бы нести этот шаг и изменить подпись:

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

Или более общий вариант метода ....

protected void ExecuteInBiggerStackThread<T>(Action<T> action, T parameterObject) 
{ 
    var bigStackThread = new Thread(() => action(parameterObject), 1024 * 1024); 
    bigStackThread.Start(); 
    bigStackThread.Join(); 
} 
Смежные вопросы