Подтвердить что ты не робот

Создание задачи LongRunning с лучшей практикой

Является ли это хорошим дизайном для фонового потока, который нужно запускать с помощью API-интерфейса задачи в .Net 4? Моя единственная проблема заключается в том, хотим ли мы отменить эту задачу, как бы я это сделал? Я знаю, что могу просто установить ProgramEnding на true, но я знаю, что в API-интерфейсе задач есть CancellationToken.

Это всего лишь пример образца кода, так что один поток будет добавляться в коллекцию, а другой поток будет удаляться из него. Задача настраивается как LongRunning, так как она должна работать непрерывно, пока программа работает

private void RemoveFromBlockingCollection()
{
    while (!ProgramEnding)
    {
       foreach (var x in DataInQueue.GetConsumingEnumerable())
       {
          Console.WriteLine("Task={0}, obj={1}, Thread={2}"
                          , Task.CurrentId, x + " Removed"
                          , Thread.CurrentThread.ManagedThreadId);
       }
    }
}

private void button1_Click(object sender, EventArgs e)
{
   DataInQueue = new BlockingCollection<string>();
   var t9 = Task.Factory.StartNew(RemoveFromBlockingCollection
                                 , TaskCreationOptions.LongRunning);

   for (int i = 0; i < 100; i++)
   {
     DataInQueue.Add(i.ToString());
     Console.WriteLine("Task={0}, obj={1}, Thread={2}", 
                       Task.CurrentId, i + " Added", 
                       Thread.CurrentThread.ManagedThreadId);
     Thread.Sleep(100);
   }
   ProgramEnding = true;
}

UPDATE: Я обнаружил, что могу удалить логическое имя ProgramEnding и использовать DataInQueue.CompleteAdding, которые заканчивают поток.

4b9b3361

Ответ 1

Как вы уже упоминали, вы можете использовать CancellationToken. Сделайте это так:

var cancellationTokenSource = new CancellationTokenSource();
Task.Factory.StartNew(RemoveFromBlockingCollection
                      , TaskCreationOptions.LongRunning
                      , cancellationTokenSource.Token);  

И позже в вашем коде вы можете отменить задачу с помощью:

cancellationTokenSource.Cancel();

В вашей долгосрочной задаче вы можете запросить токен, если была запрошена отмена:

if (cancellationTokenSource.Token.IsCancellationRequested)