Как запустить метод в отдельном потоке - PullRequest
18 голосов
/ 25 марта 2011

Я нашел очень хороший кусок кода, который запускает все методы в отдельном потоке.код следующим образом

private static void Method1()
{
    //Method1 implementation
}

private static void Method2()
{
    //Method2 implementation
}

private static void RunMethodInSeparateThread(Action action)
{
    var thread = new Thread(new ThreadStart(action));
    thread.Start();
}

static void Main(string[] args)
{
    RunMethodInSeparateThread(Method1);
    RunMethodInSeparateThread(Method2);
}

в этом случае, как я могу передать параметр методу, а также может возникнуть ситуация, когда для Method1 может потребоваться 2 параметра, а для Method2 может потребоваться 3 параметра.в этой ситуации, как построить RunMethodInSeparateThread универсальным способом, который примет много параметров и перейдет к методу.пожалуйста, помогите мне с кодом.спасибо

Ответы [ 5 ]

32 голосов
/ 25 марта 2011

Чтобы запустить некоторый код в другом потоке, вы можете сделать:

new Thread(delegate () {
    Method1(param1, param2);
}).Start();

Вы можете принять набор параметров или словарь для ваших методов, которые должны принимать переменное число параметров. Или вы можете создать отдельные методы, которые позволяют различное количество параметров. Например:

private static void Method1()
{
    //Method1 implementation
}

private static void Method1(int Param1)
{
    //Method1 implementation
}

private static void Method1(int Param1, int Param2)
{
    //Method1 implementation
}
8 голосов
/ 16 ноября 2015

В .NET 4 ваш RunMethodInSeparateThread метод кажется немного избыточным, на мой взгляд. Я бы просто сделал это:

Task.Factory.StartNew(() => { Method1(param1); });
Task.Factory.StartNew(() => { Method2(param1, param2); });
6 голосов
/ 25 марта 2011

Если Method1 и Method2 довольно короткие, лучший способ сделать это - не создавать новый поток Вместо этого вы можете использовать пул потоков .NET, например:

private static void Method1(int x)
{
    //Method1 implementation
}

private static void Method2(int x, int y)
{
    //Method2 implementation
}

public static void Main()
{
  ThreadPool.QueueUserWorkItem(() => Method1(4));
  ThreadPool.QueueUserWorkItem(() => Metho2(13, 7));
}
3 голосов
/ 25 марта 2011
private static void Method1(int x, int y, int c)
{
    //Method1 implementation
}

static void Main(string[] args)
{
    ThreadPool.QueueUserWorkItem(state => Method1(1,2,3));
}
1 голос
/ 25 марта 2011

Полезен ли «слот данных»? См. «Локальное хранилище нити: потоковые статические поля и слоты данных» по адресу http://msdn.microsoft.com/en-us/library/6sby1byh.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...