Как запустить метод в отдельном потоке
я нашел очень хороший фрагмент кода, который запускает весь метод в отдельном потоке.
код следующим образом
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 в общем виде, который будет принимать много параметров и перейти к методу. пожалуйста, помогите мне с кодом. спасибо
Ответы
Ответ 1
Чтобы запустить некоторый код в другом потоке, вы можете сделать:
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
}
Ответ 2
С .NET 4 ваш метод RunMethodInSeparateThread
кажется немного лишним, на мой взгляд. Я бы просто сделал это:
Task.Factory.StartNew(() => { Method1(param1); });
Task.Factory.StartNew(() => { Method2(param1, param2); });
Ответ 3
Если методы 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));
}
Ответ 4
private static void Method1(int x, int y, int c)
{
//Method1 implementation
}
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(state => Method1(1,2,3));
}
Ответ 5
Помогает ли "Слот данных"? См. "Локальное хранилище потоков: статические поля и разделители данных" в http://msdn.microsoft.com/en-us/library/6sby1byh.aspx