Запуск нескольких синхронных потоков

#multithreading #c#-4.0

#многопоточность #c #-4.0

Вопрос:

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

Ответ №1:

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

например

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

смотрите: http://msdn.microsoft.com/en-us/concurrency/bb964701

Ответ №2:

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

«синхронные потоки» — это оксюморон, их не существует.

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

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

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

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

Комментарии:

1. спасибо, я не слишком беспокоюсь о производительности, это редкое явление, и единственная причина, по которой я это делаю, заключается в том, что я должен выполнить несколько вызовов веб-службы одновременно

Ответ №3:

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

Комментарии:

1. это звучит как самый простой метод

Ответ №4:

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

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

Ответ №5:

Обычно вы бы поступили с конструкцией, подобной приведенной ниже,

 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();
        }
    }

}