Есть ли шанс заменить цикл while на TPL? - PullRequest
2 голосов
/ 29 сентября 2010

У меня есть два цикла while, которые я буду выполнять параллельно с TPL.

Мой код:

public void Initialize()
{
   cts = new CancellationTokenSource();

   ParallelOptions options = new ParallelOptions();
   options.CancellationToken = cts.Token;
   options.MaxDegreeOfParallelism = Environment.ProcessorCount;

    task = Task.Factory.StartNew(() => Parallel.Invoke(options, Watcher1, Watcher2), cts.Token);
}

public void Watcher1()
{
   //Can I replace this (with a TPL construct in the initialize method)?
   while(true)
   {
      //Do sth.
   }
}

public void Watcher2()
{
   //Can I replace this (with a TPL construct in the initialize method)?
   while(true)
   {
      //do sth 
   }
}

Было бы неплохо, если бы я смог безопасно отменить эти два действия. Можете ли вы дать мне несколько советов?

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

С уважением, про

Ответы [ 2 ]

2 голосов
/ 16 декабря 2012
public void Initialize()
{
   var cancellationSource = new CancellationTokenSource();
   var cancellationToken = cancellationSource.Token;

   //Start both watchers
   var task1 = Task.Factory.StartNew(() => Watcher1(cancellationToken));
   var task2 = Task.Factory.StartNew(() => Watcher2(cancellationToken));

   //As an example, keep running the watchers until "stop" is entered in the console window
   while (Console.Readline() != "stop")
   {
   }

   //Trigger the cancellation...
   cancellationSource.Cancel();

   //...then wait for the tasks to finish.
   Task.WaitAll(new [] { task1, task2 });
}

public void Watcher1(CancellationToken cancellationToken)
{
   while (!cancellationToken.IsCancellationRequested)
   {
      //Do stuff
   }
}

public void Watcher2(CancellationToken cancellationToken)
{
   while (!cancellationToken.IsCancellationRequested)
   {
      //Do stuff
   }
}
2 голосов
/ 29 сентября 2010

Вы можете сделать это, используя CancellationTokenSource, подробнее см. в этой статье

...