Cómo obtener acceso sincronizado a la array en C#

La propiedad Array.SyncRoot se usa para obtener un objeto que se puede usar para sincronizar el acceso a la array. Una array es un grupo de variables del mismo tipo a las que se hace referencia con un nombre común. La clase de array viene bajo el espacio de nombres del sistema .

Puntos importantes:

  • La sincronización de un objeto se realiza de modo que solo un subproceso pueda manipular los datos en la array.
  • Una propiedad es miembro de una clase que proporciona un medio para leer, escribir y calcular campos de datos privados.
  • La propiedad Array.SyncRoot implementa la interfaz System.Collections.ICollection .
  • El código de sincronización no puede actuar directamente en la colección, por lo que debe realizar operaciones en el SyncRoot de la colección para garantizar el correcto funcionamiento de las colecciones que se derivan de otros objetos.
  • Recuperar el valor de esta propiedad es una operación O(1).

Sintaxis: arrayName.SyncRoot

Valor de propiedad: un objeto que se puede usar para sincronizar el acceso a la array.

Ejemplo 1: en este código, usamos SyncRoot para obtener acceso sincronizado a la array llamada arr , que no es un procedimiento seguro para subprocesos y puede causar una excepción. Entonces, para evitar la excepción, bloqueamos la colección durante la enumeración.

// C# program to illustrate the 
// use of SyncRoot property
using System;
using System.Threading;
using System.Collections;
  
namespace sync_root {
  
class GFG {
  
    // Main Method
    static void Main(string[] args)
    {
  
        // Declaring an array
        Array arr = new int[] {12, 15, 20, 3, 6};
  
        // Using the SyncRoot property
        lock(arr.SyncRoot)
        {
            // foreach loop to display 
            // the elements in arr
            foreach(Object i in arr)
                Console.WriteLine(i);
        }
    }
}
}
Producción:

12
15
20
3
6

Ejemplo 2: en el siguiente ejemplo, usamos la propiedad SynRoot con una array de objetos de clase X.

// C# program to depict the use
// of SyncRoot Property
// for an array of objects
using System;
using System.Threading;
using System.Collections;
  
namespace sync_root_2 {
  
// User defined class X
class X {
  
    int x;
  
    // defining Constructor
    public X()
    {
        x = 0;
    }
  
    // Method to get the value
    // stored in x
    public int getValue()
    {
        return x;
    }
}
  
// Driver Class
public class Program {
  
    // Main Method
    static void Main(string[] args)
    {
        // Declaring an array of objects
        // of type class X
        X[] obj = new X[5];
  
        // Calling the constructor
        // for each object
        for (int i = 0; i < 5; i++)
            obj[i] = new X();
  
        // Synchronizing the array
        lock(obj.SyncRoot)
        {
            // Displaying the value
            foreach(X element in obj)
                Console.WriteLine(element.getValue());
        }
    }
}
}
Producción:

0
0
0
0
0

Referencia:

Publicación traducida automáticamente

Artículo escrito por ManasiKirloskar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *