using System;
using System.Collections.Concurrent;
namespace UsingConcurrentBag
{
class Program
{
static void Main(string[] args)
{
ConcurrentBag<int> bag = new ConcurrentBag<int>();
bag.Add(42);
bag.Add(21);
int result;
if (bag.TryTake(out result))
Console.WriteLine(result);
if (bag.TryPeek(out result))
Console.WriteLine("There is a next item: {0} ", result);
}
}
}
Una cosa para mantener en mene es que el método TryPeek no es muy util en un medio ambiente de multihilos. Este podría ser otro hilo remueve el elemento antes de que usted puede acceder a este.
ConcurrentBag también implementa IEnumerable<T>, asi que usted puede interinar sobre este. Esta operación es hecho como un hilo seguro haciendo una imagen de la colección cuando inicia iterar en esta, asi los elementos agregados a la colección después de iniciar la iteración este no sería visible, como se ve en el siguiente ejemplo.
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
namespace EnumeratingConcurrentBag
{
class Program
{
static void Main(string[] args)
{
ConcurrentBag<int> bag = new ConcurrentBag<int>();
Task.Run(() =>
{
bag.Add(42);
Thread.Sleep(10000);
bag.Add(21);
});
Task.Run(() =>
{
foreach (int i in bag)
Console.WriteLine(i);
}).Wait();
}
}
}
NOTA
En el ejemplo de la referencia el valor era de 1000 milisegundos y de esa forma el resultado no se presentaba como el libro menciona y el valor se coloco como: 10,000
El código despliega 42 porque el otro valor es agregado después de iterar sobre la bolsa que ha iniciado.
Referencia:
Exam Ref. 70-483 Programming in C#
No hay comentarios.:
Publicar un comentario