2015-02-12 2 views
0

Я создаю много потоков, используя метод нижеStop, чтобы закончить все темы, прежде чем начинать новые темы с # 4.0

Task.Factory.StartNew(() => 
          { 
          //do some task here 
          }); 

В какой-то момент времени я хочу, чтобы выполнить метод, но перед тем, что я хочу

  1. Убедитесь, что все текущие потоки выполняются.
  2. Убедитесь, что существует какой-либо вызов для создания нового потока, который должен ждать и не потеряться.
  3. После запуска моего метода запустите все ожидающие потоки.

Любое хорошее решение будет оценено по достоинству.

Заранее спасибо

-------------------- Edited код ----------------- ------

for (int i = 0; i < 10; i++) 
    { 
     Task.Factory.StartNew(() => 
     { 
      Console.WriteLine("First Thread @ " + DateTime.Now.ToString()); 

     }); 
    } 

Когда мы достигаем к этому вызову, это должно проверить все незавершенные задачи перед выполнением

Console.WriteLine ("************** ***** назвал другой метод *********************** ");

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

for (int i = 0; i < 10; i++) 
    { 
     Task.Factory.StartNew(() => 
     { 
      Console.WriteLine("Second Thread @ " + DateTime.Now.ToString()); 

     }); 
    } 
+0

Try используя CountdownEvent класса https://msdn.microsoft.com/en-us/library/system.threading.countdownevent(VS.100).aspx – BoldAsLove

+0

https://msdn.microsoft.com/ en-us/library/95hbf2ta% 28v = vs.110% 29.aspx – mhs

+0

Итак, вы хотите иметь два типа задач: первый тип может запускаться одновременно, а второй тип должен работать исключительно? – PetSerAl

ответ

0

Я думаю, что вы действительно хотите реализовать какую-то очередность, которая выполняет работу в одном потоке. Вот некоторые минимальные реализации (непроверенная!)

class QueuedWorker 
{ 
    ConcurrentQueue<Action> queue = new ConcurrentQueue<Action>(); 
    ManualResetEvent waiter = new ManualResetEvent(false); 
    Thread workerThread; 

    public QueuedWorker() 
    { 
     workerThread = new Thread(ThreadWorker); 
     workerThread.Start(); 
    } 

    private void ThreadWorker() 
    { 
     Action nextTask; 

     while(true) 
     {  
      while(queue.TryDequeue(out nextTask)) 
      { 
       // run the queued task 
       nextTask(); 
      } 

      waiter.WaitOne(); 
      waiter.Reset(); 
     } 
    } 

    public void Enqueue(Action item) 
    { 
     queue.Enqueue(item); 
     waiter.Set(); 
    } 
} 
+0

Спасибо за ответ. Я отредактировал мой вопрос. Не могли бы вы предложить здесь? –

0

Я решил проблему моего сам, храня задачи, созданные в список и применение блокировки на нем.

class Program 
     { 
      static List<Task> taskList = new List<Task>(); 

      static void Main(string[] args) 
      { 
       Task.Factory.StartNew(() => { StartTasks("First"); }); 
       Task.Factory.StartNew(() => { LoadMethod(); }); 
       Task.Factory.StartNew(() => { StartTasks("Second"); StartTasks("Third"); }); 
       Task.Factory.StartNew(() => { LoadMethod(); }); 
       Task.Factory.StartNew(() => { StartTasks("Four"); }); 
       Task.Factory.StartNew(() => { LoadMethod(); }); 
       Task.Factory.StartNew(() => { StartTasks("Five"); StartTasks("Six"); StartTasks("Seven"); StartTasks("Eight"); }); 
       Task.Factory.StartNew(() => { LoadMethod(); }); 
       Task.Factory.StartNew(() => { StartTasks("Nine"); StartTasks("Ten"); }); 
       Task.Factory.StartNew(() => { LoadMethod(); }); 

       Console.WriteLine("Execution is completed !"); 
       Console.ReadKey(); 
      } 

      public static void LoadMethod() 
      { 
       // Lock and wait to not allow any thead to modify the list 
       lock (taskList) 
       { 
        if (taskList.Any()) 
        { 
         Task.WaitAll(taskList.ToArray()); 
        } 

        Debug.WriteLine("*******************Called Another Method***********************"); 
        taskList.Clear(); 
       } 
      } 

      public static void StartTasks(string taskName) 
      { 
       lock (taskList) 
       { 
        for (int i = 0; i < 10; i++) 
        { 
         var t = new Task(() => 
         { 
          Debug.WriteLine(taskName + " @ " + DateTime.Now.ToString()); 
          //System.Threading.Thread.Sleep(500); 
         }); 
         taskList.Add(t); 
        } 

        Task.Factory.StartNew(() => taskList.ForEach(task => 
        { 
         if (task.Status == TaskStatus.Created) 
         { 
          task.Start(); 
         } 
        }), TaskCreationOptions.AttachedToParent); 
       } 
      } 
     } 
Смежные вопросы