Является ли это хорошим дизайном для фонового потока, который нужно запускать с помощью 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, которые заканчивают поток.