2015-07-27 7 views
0

Я попытался этоParallel.Invoke выполняет первый метод только

Parallel.Invoke(() => Method1(),() => Method2()); 

начать method1 & Method2 воздействующий в то же время. Но Метод1 только получает выполнение. Любое решение, пожалуйста.

В продолжение this, я добавил код ниже.

class Program 
{ 
    static void Main(string[] args) 
    { 
     CancellationTokenSource cts = new CancellationTokenSource(); 
     Task.Factory.StartNew(() => { Thread.Sleep(5000); cts.Cancel(); }); 
     ProcessFiles(cts.Token); 
     Console.ReadKey(); 
    } 

    public static void ProcessFiles(CancellationToken cts) 
    { 
     try 
     { 
      LimitedConcurrencyLevelTaskScheduler lcts = new LimitedConcurrencyLevelTaskScheduler(2); 
      List<Task> tasks = new List<Task>(); 
      TaskFactory factory = new TaskFactory(lcts); 

      Parallel.Invoke(
       () => Method1(cts, tasks, factory), 
       () => Method2(cts, tasks, factory)); 

      Task.WaitAll(tasks.Where(t => t != null).ToArray()); 

      Console.WriteLine("\n\nSuccessful completion."); 
      Console.ReadLine(); 
     } 
     catch (AggregateException aex) 
     { 
      // Ignore 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

    private static void Method1(CancellationToken cts, List<Task> tasks, TaskFactory factory) 
    { 
     for (int i = 0; i < 1000; i++) 
     { 
      int i1 = i; 
      var t = factory.StartNew(() => 
      { 
       Console.WriteLine("Method 1 --- {0} --- {1}", i1, GetGuid()); 
      }, cts); 

      tasks.Add(t); 
     } 
    } 

    private static void Method2(CancellationToken cts, List<Task> tasks, TaskFactory factory) 
    { 
     for (int i = 0; i < 1000; i++) 
     { 
      int i1 = i; 
      var t = factory.StartNew(() => 
      { 
       Console.WriteLine("Method 2 --- {0} --- {1}", i1, GetGuid()); 
      }, cts); 

      tasks.Add(t); 
     } 
    } 

    private static Guid GetGuid() 
    { 
     Thread.Sleep(TimeSpan.FromSeconds(1)); 
     return Guid.NewGuid(); 
    } 
} 

O/P: Используется только метод1. Метод2 - нет.

enter image description here

+2

Метод 1 представляет собой очередность задач, прежде чем метод 2 получит шанс. Затем вы заканчиваете работу до того, как задания Method 2 даже начнутся. Поместите некоторые Console.WriteLines (или Thread.Sleep()) прямо перед 'factory.StartNew()', и это приведет к задержке, достаточной для того, чтобы вы могли смешивать метод 2. – Rob

+1

Роб прав - но есть некоторые другие вопросы. Кроме того, загляните в Task.Delay и обратите внимание, что сравнение cts с null неверно (это struct - это никогда не null) - вы, вероятно, имеете в виду что-то вроде cts.ThrowIfCancellationRequested –

+0

Я могу видеть оба метода после добавления Console.WriteLines (или Thread. Спать()). Спасибо –

ответ

0

Я могу видеть оба метода выполняются после добавления Console.WriteLines (или Thread.Sleep()) перед factory.StartNew().

Thanks Rob for solution