активация потоков C#

у меня есть этот код в 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 концы). То, что я действительно исправлял?

5
задан David Pfeffer 12 February 2010 в 13:10
поделиться

1 ответ

«Он не работает» - не очень четкий набор симптомов. Что вы наблюдаете?

РЕДАКТИРОВАТЬ: Хорошо, теперь, когда вы сказали, в чем заключается ошибка компилятора, ее намного проще диагностировать. В настоящее время вы вызываете метод и пытаетесь использовать результат в качестве задачи для выполнения потоком. Предполагая, что вы на самом деле хотите вызвать этот метод при запуске потока, вам нужно что-то вроде этого:

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 значительно упрощает это.

4
ответ дан 15 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: