programming parallelism parallel net examples example c# .net multithreading .net-4.0 task-parallel-library

c# - parallelism - vb net parallel programming examples



La mejor práctica de creación de tareas LongRunning (1)

Como ya mencionaste, puedes usar el CancelToken. Hacerlo de esta forma:

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

Y más adelante en su código, puede cancelar la tarea con:

cancellationTokenSource.Cancel();

En su tarea de larga ejecución, puede solicitar el token, si se solicitó la cancelación:

if (cancellationTokenSource.Token.IsCancellationRequested)

¿Es este un buen diseño para un subproceso en segundo plano que debe ejecutarse utilizando la API de tareas en .Net 4? Mi única preocupación es si queremos cancelar esa tarea, ¿cómo lo haría? Sé que puedo establecer ProgramEnding en true pero sé que hay una CancellationToken de CancellationToken en la API de Tarea.

Esto es solo un ejemplo de código de ejemplo, de modo que un subproceso se agregará a una colección y otro subproceso se eliminará de él. La tarea se configura como LongRunning, ya que debe ejecutarse continuamente mientras se ejecuta el programa

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; }

ACTUALIZACIÓN: encontré que puedo eliminar el booleano ProgramEnding y usar DataInQueue.CompleteAdding que pone el hilo al final.