Как создать новый поток для выполнения действия <T> - PullRequest
8 голосов
/ 20 июля 2010

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

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

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

Ответы [ 4 ]

8 голосов
/ 20 июля 2010

Я бы даже не стал беспокоиться с 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) { ... }
7 голосов
/ 20 июля 2010

Что-то подобное должно сработать:

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();
}
3 голосов
/ 16 марта 2012

Или более общая версия метода ....

protected void ExecuteInBiggerStackThread<T>(Action<T> action, T parameterObject)
{
  var bigStackThread = new Thread(() => action(parameterObject), 1024 * 1024);
  bigStackThread.Start();
  bigStackThread.Join();
}
0 голосов
/ 20 июля 2010

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

...