Выключить несколько синхронных потоков - PullRequest
1 голос
/ 12 мая 2011

Я не уверен, что это глупый вопрос, так как я мало что знаю о потоках, но возможно ли запустить несколько синхронных потоков одновременно и подождать, пока все завершится, прежде чем действовать?Если это как ты это делаешь?

Ответы [ 5 ]

3 голосов
/ 12 мая 2011

Конечно, самый простой способ - использовать параллельную библиотеку задач (TPL) .NET 4.0.

, например

Parallel.For(0, 10, x => 
// Do this in Parallel.
System.Diagnostics.Debug.WriteLine(x)
);

см .: http://msdn.microsoft.com/en-us/concurrency/bb964701

2 голосов
/ 12 мая 2011

но возможно ли запустить несколько синхронных потоков одновременно и дождаться завершения всех действий?

"синхронные потоки" - оксюморон, они нене существует.

Конечно, вы можете запустить несколько потоков и ждать их завершения (Thread.Join(otherThread))

Если это как вы это делаете?

Очень редко.Всегда используйте как можно меньше ниток.Они дорогие.

Убедитесь, что вы знаете о ThreadPool и (Fx4) библиотеке задач, TPL

1 голос
/ 12 мая 2011

Вы можете использовать Parallel.Invoke.
Это выполнит предоставленные действия параллельно и вернется, когда все будет закончено.

0 голосов
/ 12 мая 2011

Как правило, вы делаете с конструкцией, как показано ниже,

public class MultipleThreqadTest
{
    private readonly Thread[] threads;
    private readonly object locker;
    private int finishCounter;
    private readonly AutoResetEvent waitEvent;

    public MultipleThreqadTest()
    {
        threads=new Thread[10];
        for(int i=0;i<0;i++)
            threads[i]=new Thread(DoWork);
        finishCounter = threads.Length;
        waitEvent=new AutoResetEvent(false);

    }
    public void StartAll()
    {
        foreach (var thread in threads)
        {
            thread.Start();
        }
        //now wait for all worker threads to complete
        waitEvent.WaitOne();
    }


    private void DoWork()
    {
        //Do Some Actual work here, you may need to lock this in case you are workin on some shared resource
        //lock(locker)
        //{

        //}

        //Check if all worker thread complets
        if(Interlocked.Decrement(ref finishCounter)==0)
        {
            this.waitEvent.Set();
        }
    }

}
0 голосов
/ 12 мая 2011

Вы не можете делать ничего в одно и то же время, не говоря уже о том, чтобы запускать потоки :) (хотя вы можете запускать их быстро один за другим, хотя, возможно, поток будет запущен до того, как последний уволен).

Что касается ожидания их всех перед продолжением, вы можете использовать метод Join, который ожидает окончания потока перед продолжением.

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