у меня есть этот код в C#:
Thread t1 = new Thread(functionsActivations(3, 4000, 0, 4));
Thread t2 = new Thread(functionsActivations(3, 4000, 5, 9));
t1.start();
t2.Start();
Thread t3 = new Thread(functionsActivations(4, 4000, 0, 4));
Thread t4 = new Thread(functionsActivations(4, 4000, 5, 9));
Это не работает. Как я могу сказать этому называть метод, который я дал ему? Во-вторых, я хочу, чтобы t3 и t4 были активированы после t1, и t2 заканчивают работать. Как я могу сделать это? В-третьих, я хочу, чтобы t1 и t2 не заблокировались (так, чтобы t2 не должен был бы ожидать до t1 концы). То, что я действительно исправлял?
«Он не работает» - не очень четкий набор симптомов. Что вы наблюдаете?
РЕДАКТИРОВАТЬ: Хорошо, теперь, когда вы сказали, в чем заключается ошибка компилятора, ее намного проще диагностировать. В настоящее время вы вызываете метод и пытаетесь использовать результат в качестве задачи для выполнения потоком. Предполагая, что вы на самом деле хотите вызвать этот метод при запуске потока, вам нужно что-то вроде этого:
C # 2:
Thread t1 = new Thread(delegate() { functionsActivations(3, 4000, 0, 4); });
C # 3:
Thread t1 = new Thread(() => functionsActivations(3, 4000, 0, 4));
Альтернатива наличию лямбда-выражений повсюду лучше всего написать служебный метод:
private static Action DeferFunctionActivations(int a, int b, int c, int d)
{
return () => functionsActivations(a, b, d, d);
}
Затем вы можете использовать:
Thread t1 = new Thread(DeferFunctionActivations(3, 4000, 0, 4));
и т. д.
В оставшейся части сообщения я буду использовать C # 3.
Кроме того, t1.start ()
должен быть t1.Start ()
- C # чувствителен к регистру .
Чтобы ответить на ваш последний вопрос, t1
и t2
в настоящее время независимы - они не будут блокировать друг друга, если у вас нет синхронизации где-то в коде, который они Бег.
Если вы хотите, чтобы t3
и t4
запускались только после завершения t1
и t2
, вы можете использовать Thread .Join
:
Thread t1 = new Thread(() => functionsActivations(3, 4000, 0, 4));
Thread t2 = new Thread(() => functionsActivations(3, 4000, 5, 9));
t1.Start();
t2.Start();
t1.Join();
t2.Join();
Thread t3 = new Thread(() => functionsActivations(4, 4000, 0, 4));
Thread t4 = new Thread(() => functionsActivations(4, 4000, 5, 9));
t3.Start();
t4.Start();
Обратите внимание, что это означает, что этот поток также будет ждать завершения t1
и t2
. Если этого недостаточно для вас, есть разные варианты, но в основном вам нужно что-то еще, чтобы асинхронно ждать завершения t1 и t2.Например, вы можете связать для этого дополнительный поток:
Thread t1 = new Thread(() => functionsActivations(3, 4000, 0, 4));
Thread t2 = new Thread(() => functionsActivations(3, 4000, 5, 9));
t1.Start();
t2.Start();
Thread t3 = new Thread(() => functionsActivations(4, 4000, 0, 4));
Thread t4 = new Thread(() => functionsActivations(4, 4000, 5, 9));
Thread t5 = new Thread(() =>
{
t1.Join();
t2.Join();
t3.Start();
t4.Start();
});
t5.Start();
Немного неприятно, но он должен работать.
Умеете ли вы использовать .NET 4.0? Если это так, то фреймворк Parallel Extensions значительно упрощает это.