Lista segura de hilos en C#

Muhammad Maisam Abbas 16 febrero 2024
  1. Lista segura de hilos con la clase ConcurrentBag en C#
  2. Lista segura de hilos con la clase ConcurrentQueue en C#
  3. Lista segura de hilos con la clase SynchronizedCollection en C#
Lista segura de hilos en C#

Este tutorial presentará los métodos para crear una lista segura para hilos en C#.

Lista segura de hilos con la clase ConcurrentBag en C#

La clase ConcurrentBag se utiliza para crear una colección de datos desordenada y segura para hilos en C#. La clase ConcurrentBag es muy similar a la List en C# y se puede usar como una lista segura para hilos en C#. Para usar la clase ConcurrentBag, tenemos que importar el espacio de nombres System.Collections.Concurrent en nuestro proyecto. Varios hilos pueden acceder a un objeto ConcurrentBag simultáneamente, pero el contenido dentro del objeto ConcurrentBag solo se puede modificar de forma síncrona. Lo hace utilizable con múltiples hilos para operaciones simultáneas y a salvo de la pérdida accidental de datos. El siguiente ejemplo de código nos muestra cómo crear una lista segura para hilos con la clase ConcurrentBag en C#.

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;

namespace thread_safe_list {
  class Program {
    static void Main(string[] args) {
      ConcurrentBag<int> numbers = new ConcurrentBag<int>();
      numbers.Add(0);
      numbers.Add(1);
      numbers.Add(2);
      numbers.Add(3);
      numbers.Add(4);
      numbers.Add(5);
      Console.WriteLine("ConcurrentBag");
      foreach (var number in numbers) {
        Console.WriteLine(number);
      }
      List<int> nums = new List<int>();
      nums.Add(0);
      nums.Add(1);
      nums.Add(2);
      nums.Add(3);
      nums.Add(4);
      nums.Add(5);
      Console.WriteLine("List");
      foreach (var number in nums) {
        Console.WriteLine(number);
      }
    }
  }
}

Producción :

ConcurrentBag
5
4
3
2
1
0
List
0
1
2
3
4
5

En el código anterior, creamos una lista segura para hilos con la clase ConcurrentBag en C#. La función para agregar nuevos elementos Add() es la misma en las estructuras de datos ConcurrentBag y List. La única diferencia es que la Lista funciona según el principio de primero en entrar, primero en salir (FIFO), mientras que el ConcurrentBag funciona según el principio de último en entrar, primero en salir (LIFO). Este problema se aborda en los ejemplos de código a continuación.

Lista segura de hilos con la clase ConcurrentQueue en C#

La clase ConcurrentQueue se utiliza para crear una estructura de datos de cola segura para hilos en C#. La ConcurrentQueue funciona según el principio de primero en entrar, primero en salir, al igual que la List en C#. El objeto ConcurrentQueue se puede utilizar en lugar del objeto List para crear una estructura de datos segura para hilos. Vea el siguiente código de ejemplo.

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;

namespace thread_safe_list {
  class Program {
    static void Main(string[] args) {
      Console.WriteLine("Concurrent Queue");
      ConcurrentQueue<int> numbers = new ConcurrentQueue<int>();
      numbers.Enqueue(0);
      numbers.Enqueue(1);
      numbers.Enqueue(2);
      numbers.Enqueue(3);
      numbers.Enqueue(4);
      numbers.Enqueue(5);
      foreach (var number in numbers) {
        Console.WriteLine(number);
      }
      Console.WriteLine("List");
      List<int> nums = new List<int>();
      nums.Add(0);
      nums.Add(1);
      nums.Add(2);
      nums.Add(3);
      nums.Add(4);
      nums.Add(5);
      foreach (var number in nums) {
        Console.WriteLine(number);
      }
    }
  }
}

Producción :

Concurrent Queue
0
1
2
3
4
5
List
0
1
2
3
4
5

En el código anterior, creamos una estructura de datos List segura para hilos con la clase ConcurrentQueue en C#. Hay bastantes diferencias entre los métodos disponibles en las estructuras de datos List y ConcurrentQueue. Por ejemplo, el método para agregar un nuevo elemento en la estructura de datos Lista es Add(). Por el contrario, el método para agregar un nuevo elemento en la estructura de datos ConcurrentQueue es Enqueue(), que es como una estructura de datos convencional Queue en C#. Este inconveniente de la estructura de datos ConcurrentQueue se aborda en el siguiente ejemplo.

Lista segura de hilos con la clase SynchronizedCollection en C#

La clase SynchronizedCollection se utiliza para crear una colección segura para hilos de objetos de algún tipo especificado en C#. La estructura de datos SynchronizedCollection es muy similar a la estructura de datos List en C#. Ambas estructuras de datos funcionan según el principio de primero en entrar, primero en salir. La función para agregar un nuevo elemento en las estructuras de datos SynchronizedCollection y List es Add(). Vea el siguiente ejemplo.

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;

namespace thread_safe_list {
  class Program {
    static void Main(string[] args) {
      Console.WriteLine("Synchronized Collection");
      SynchronizedCollection<int> numbers = new SynchronizedCollection<int>();
      numbers.Add(0);
      numbers.Add(1);
      numbers.Add(2);
      numbers.Add(3);
      numbers.Add(4);
      numbers.Add(5);
      foreach (var number in numbers) {
        Console.WriteLine(number);
      }
      Console.WriteLine("List");
      List<int> nums = new List<int>();
      nums.Add(0);
      nums.Add(1);
      nums.Add(2);
      nums.Add(3);
      nums.Add(4);
      nums.Add(5);
      foreach (var number in nums) {
        Console.WriteLine(number);
      }
    }
  }
}

Producción :

Synchronized Collection
0
1
2
3
4
5
List
0
1
2
3
4
5

En el código anterior, creamos una lista segura para hilos con la clase SynchronizedCollection en C#. Hasta ahora, este enfoque es el mejor entre los otros dos enfoques para implementar la funcionalidad de una estructura de datos de lista en C# porque sigue el mismo principio FIFO y tiene los mismos métodos.

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

Artículo relacionado - Csharp Thread

Artículo relacionado - Csharp List