AYUDA .NET

C# Volátil (Cómo funciona para los desarrolladores)

Introducción

La palabra clave volatile en C# se utiliza para indicar que un campo puede ser actualizado por hilos que se ejecutan concurrentemente. Un campo que ha sido etiquetado como volatile alerta al compilador y al tiempo de ejecución sobre la posibilidad de que hilos concurrentes u otros componentes del programa puedan cambiar el valor del campo sin previo aviso. Esto garantiza que los accesos a la memoria de ese campo no serán optimizados por el compilador, lo que podría causar un comportamiento inesperado en [aplicaciones multihilo](https://en.wikipedia.org/wiki/Multithreading_(computer_architecture).

Una biblioteca de C# muy popular para crear y modificar documentos PDF se llama IronPDF - .NET PDF Library. Saber cómo utilizar adecuadamente la palabra clave volatile es crucial cuando se trabaja con aplicaciones multihilo o programas que utilizan IronPDF para la creación o manipulación de PDF. Esto ayudará a garantizar que los datos estén correctamente sincronizados y sean coherentes cuando varios subprocesos accedan a ellos.

Este tutorial cubrirá las mejores formas de utilizar IronPDF y la palabra clave volatile para crear aplicaciones multihilo confiables que generen o manipulen PDFs. Repasaremos los usos más comunes de los campos volátiles, cómo declararlos y utilizarlos correctamente y las prácticas recomendadas para asegurarse de que sus aplicaciones con IronPDF son seguras. ¡Ahora empecemos!

Cómo utilizar C# Volátil

  1. Importar bibliotecas necesarias.

  2. Declarar variable volátil.

  3. Iniciar tarea de generación de PDF.

  4. Establecer variable volátil en la tarea.

  5. Compruebe la variable volátil.

  6. Espere a que se genere el PDF.

  7. Manejar la finalización de PDF.

¿Qué es C# Volátil?

Declarar un campo que podría ser modificado por varios hilos ejecutándose de manera concurrente se realiza utilizando la palabra clave volatile. Cuando un campo se designa como volátil, se avisa al compilador y al tiempo de ejecución de que otros componentes del programa, incluidos los hilos concurrentes, pueden modificar su valor sin previo aviso. Por este motivo, las lecturas y escrituras en el campo volátil siempre se realizan directamente hacia y desde la misma memoria en primer lugar.

La palabra clave volatile aborda problemas relacionados con la reordenación de operaciones de memoria al aplicar barreras de memoria. Una barrera de memoria garantiza que las operaciones de memoria no se reordenan a través de accesos volátiles, evitando comportamientos inesperados en escenarios multihilo.

Al emplear barreras de memoria implícitamente antes y después de la lectura volátil o durante las operaciones de escritura volátil, volatile garantiza el orden correcto de las operaciones de memoria, mejorando la seguridad de los hilos y la consistencia de los datos en entornos concurrentes en comparación con los problemas que podrían haber surgido al usar cualquier objeto no volátil.

Finalidad de la palabra clave volátil

La palabra clave volatile en C# se utiliza principalmente para manejar situaciones en las cuales múltiples hilos se sincronizan incorrectamente para acceder y modificar la ubicación de memoria de datos compartidos. En entornos multihilo, el compilador podría optimizar los accesos a memoria de forma que podría causar un comportamiento impredecible si el modificador volatile no está presente.

Los desarrolladores pueden indicar al compilador que el valor de un campo puede cambiar de forma asíncrona y que la integridad de los datos requiere un acceso directo a la memoria designando el campo como volátil.

Comportamiento de las palabras clave volátiles

El compilador y el tiempo de ejecución se aseguran de que cada operación de lectura y escritura en memoria en un campo marcado como volátil evite el uso de cualquier posible método de almacenamiento en caché. Esto indica que el valor de un campo volátil siempre se obtendrá de la memoria principal en un acceso posterior, incluso si un hilo lo almacena en caché, en lugar de depender del mismo valor una vez que se ha almacenado en caché. Del mismo modo, las modificaciones realizadas por un hilo son visibles para todos los demás hilos que accedan al mismo campo, ya que las escrituras en un campo volátil se propagan instantáneamente a la memoria.

Uso de volátil para estado compartido

Utilicemos algunos ejemplos de código para demostrar cómo usar la palabra clave volatile.

using System;
using System.Threading;
class SharedStateExample
{
    private volatile bool _isRunning = true;
    public void Run()
    {
        Thread thread1 = new Thread(ChangeState);
        Thread thread2 = new Thread(ReadState);
        thread1.Start();
        thread2.Start();
    }
    private void ChangeState()
    {
        while (_isRunning)
        {
            Console.WriteLine("Changing state...");
            Thread.Sleep(1000);
            _isRunning = false;
        }
    }
    private void ReadState()
    {
        while (_isRunning)
        {
            Console.WriteLine("Reading state...");
            Thread.Sleep(500);
        }
        Console.WriteLine("State is no longer running.");
    }
}
class Program
{
    static void Main(string[] args)
    {
        SharedStateExample example = new SharedStateExample();
        example.Run();
    }
}
using System;
using System.Threading;
class SharedStateExample
{
    private volatile bool _isRunning = true;
    public void Run()
    {
        Thread thread1 = new Thread(ChangeState);
        Thread thread2 = new Thread(ReadState);
        thread1.Start();
        thread2.Start();
    }
    private void ChangeState()
    {
        while (_isRunning)
        {
            Console.WriteLine("Changing state...");
            Thread.Sleep(1000);
            _isRunning = false;
        }
    }
    private void ReadState()
    {
        while (_isRunning)
        {
            Console.WriteLine("Reading state...");
            Thread.Sleep(500);
        }
        Console.WriteLine("State is no longer running.");
    }
}
class Program
{
    static void Main(string[] args)
    {
        SharedStateExample example = new SharedStateExample();
        example.Run();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

La clase SharedStateExample en este ejemplo tiene un campo isRunning que está marcado como un objeto volátil. Un método ChangeState está diseñado para cambiar el estado, y un método ReadState establece un estado de operación de lectura volátil.

Mientras el método ReadState verifica continuamente el valor de isRunning, el método ChangeState se retrasa y luego establece isRunning en false. Los cambios realizados por un solo hilo son instantáneamente visibles para el otro hilo debido a la volatilidad de isRunning.

Bloqueo doble con volátil

using System;
class Singleton
{
    private static volatile Singleton _instance;
    private static readonly object _lock = new object();
    private Singleton() { }
    public static Singleton GetInstance()
    {
        if (_instance == null)
        {
            lock (_lock)
            {
                if (_instance == null)
                {
                    _instance = new Singleton();
                }
            }
        }
        return _instance;
    }
}
class Program
{
    static void Main(string[] args)
    {
        Singleton instance1 = Singleton.GetInstance();
        Singleton instance2 = Singleton.GetInstance();
        Console.WriteLine("Are instances equal? " + (instance1 == instance2));
    }
}
using System;
class Singleton
{
    private static volatile Singleton _instance;
    private static readonly object _lock = new object();
    private Singleton() { }
    public static Singleton GetInstance()
    {
        if (_instance == null)
        {
            lock (_lock)
            {
                if (_instance == null)
                {
                    _instance = new Singleton();
                }
            }
        }
        return _instance;
    }
}
class Program
{
    static void Main(string[] args)
    {
        Singleton instance1 = Singleton.GetInstance();
        Singleton instance2 = Singleton.GetInstance();
        Console.WriteLine("Are instances equal? " + (instance1 == instance2));
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

En este ejemplo, utilizamos mecanismos de bloqueo de doble comprobación para construir un diseño Singleton a prueba de hilos. Para garantizar que las modificaciones realizadas entre múltiples hilos estén actualizadas y sean visibles, el campo _instance se designa como volátil. Esto evita situaciones en las que un único hilo observe una instancia Singleton que solo está medio inicializada. Incluso en un contexto multihilo, el mecanismo de bloqueo de doble comprobación garantiza que sólo se produzca una instancia del Singleton.

¿Qué es IronPDF?

La biblioteca de C# IronPDF - Generación y Edición de PDF permite a los programadores crear, modificar y renderizar documentos PDF dentro de aplicaciones .NET. Su amplio conjunto de funciones simplifica el trabajo con archivos PDF. Los documentos PDF ya existentes pueden editarse, dividirse y fusionarse. Los documentos PDF pueden crearse en HTML, imágenes y otras formas. Los PDF pueden tener texto, fotos y otros datos anotados.

Características de IronPDF

Anotación de texto e imágenes

Con IronPDF, puede anotar mediante programación documentos PDF con texto, imágenes y otros datos. Con esta herramienta puede anotar archivos PDF con firmas, sellos y comentarios.

Seguridad PDF

IronPDF permite especificar distintos permisos, como imprimir, copiar y editar el documento, y puede cifrar documentos PDF con contraseñas. Esto ayuda a controlar quién tiene acceso a los archivos PDF y a salvaguardar la información confidencial.

Rellenar formularios PDF interactivos

Con IronPDF, los formularios PDF interactivos pueden rellenarse mediante programación. Esta funcionalidad es útil para crear documentos personalizados basados en las entradas del usuario y automatizar el envío de formularios.

Compresión y optimización de PDF

IronPDF ofrece opciones de optimización y compresión de archivos PDF que minimizan el tamaño sin sacrificar la calidad. Como resultado, los documentos PDF exigen menos espacio de almacenamiento y funcionan de forma más eficiente.

Compatibilidad multiplataforma

IronPDF está diseñado para funcionar a la perfección con programas .NET en diversos sistemas operativos, como Windows, Linux y macOS. Se integran marcos .NET conocidos como ASP.NET, .NET Core y Xamarin.

Crear un nuevo proyecto de Visual Studio

Crear un proyecto de consola en Visual Studio es un proceso sencillo. Para iniciar una aplicación de consola, siga estos sencillos pasos en el entorno de Visual Studio:

Antes de utilizar Visual Studio, asegúrese de que está instalado en su ordenador.

Iniciar un nuevo proyecto

Seleccione Archivo, luego Nuevo y, por último, Proyecto.

C# Volatile (Cómo funciona para los desarrolladores): Figura 1

En el cuadro "Crear un nuevo proyecto", selecciona tu lenguaje de programación preferido (C#, por ejemplo) de la lista a la izquierda.

La siguiente lista de referencia de plantillas de proyecto tiene disponible la plantilla "Aplicación de consola" o "Aplicación de consola (.NET Core)" para su selección.

Introduzca un nombre para su proyecto en el campo "Nombre".

C# Volatile (Cómo Funciona Para Desarrolladores): Figura 2

Seleccione la ubicación donde se guardará el proyecto.

Al hacer clic en "Crear" se iniciará el proyecto de la aplicación Consola.

C# Volatile (Cómo funciona para desarrolladores): Figura 3

Instalación de IronPDF

El menú Herramientas de Visual Studio contiene la interfaz Visual Command-Line. Seleccione el Gestor de paquetes NuGet. En la pestaña del terminal de gestión de paquetes, debe escribir el siguiente comando.

Install-Package IronPdf
Install-Package IronPdf
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'Install-Package IronPdf
$vbLabelText   $csharpLabel

También puede utilizar el Gestor de paquetes. La instalación del paquete directamente en la solución es posible con la opción NuGet Package Manager. Utilice el cuadro de búsqueda del sitio web del NuGet Manager para localizar paquetes. La siguiente captura de pantalla muestra lo fácil que es buscar "IronPDF" en el gestor de paquetes:

C# Volatile (Cómo Funciona para Desarrolladores): Figura 4 - Instalación de IronPDF desde el administrador de paquetes NuGet

Los resultados de la búsqueda se muestran en la imagen superior. Por favor, realice los siguientes cambios para que el software se instale más fácilmente en su máquina.

Tras descargar e instalar el paquete, ya podemos utilizarlo en el proyecto en curso.

Garantizar la seguridad de los subprocesos en la generación de PDF con C# Volatile y IronPDF

Ahora usemos IronPDF y la palabra clave volatile juntos en un programa de C#. IronPDF es una conocida biblioteca de C# para crear y modificar documentos PDF. Debe mantenerse la seguridad de los subprocesos cuando se trabaja con aplicaciones multiproceso que utilizan IronPDF para la creación o el procesamiento de PDF.

He aquí un ejemplo que muestra cómo utilizar la palabra clave volátil de IronPDF para crear documentos PDF en un entorno multihilo.

using IronPdf;
using System;
using System.Threading;
class PdfGenerator
{
    private volatile bool _isRunning = true;
    private readonly object _lock = new object();
    public void GeneratePdf(string filePath)
    {
        Thread thread = new Thread(() =>
        {
            while (_isRunning)
            {
                // Generate PDF document
                GenerateDocument(filePath);
                // Sleep for some time
                Thread.Sleep(5000);
            }
        });
        thread.Start();
    }
    public void StopPdfGeneration()
    {
        lock (_lock)
        {
            _isRunning = false;
        }
    }
    private void GenerateDocument(string filePath)
    {
        // Load HTML content
        string htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>";
        // Convert HTML to PDF
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(content);
        // Save PDF to file
        pdfDocument.SaveAs(filePath);
        // Output status
        Console.WriteLine($"PDF generated and saved to {filePath}");
    }
}
class Program
{
    static void Main(string[] args)
    {
        PdfGenerator pdfGenerator = new PdfGenerator();
        // Start PDF generation
        pdfGenerator.GeneratePdf("output.pdf");
        // Wait for user input to stop PDF generation
        Console.WriteLine("Press any key to stop PDF generation...");
        Console.ReadKey();
        // Stop PDF generation
        pdfGenerator.StopPdfGeneration();
    }
}
using IronPdf;
using System;
using System.Threading;
class PdfGenerator
{
    private volatile bool _isRunning = true;
    private readonly object _lock = new object();
    public void GeneratePdf(string filePath)
    {
        Thread thread = new Thread(() =>
        {
            while (_isRunning)
            {
                // Generate PDF document
                GenerateDocument(filePath);
                // Sleep for some time
                Thread.Sleep(5000);
            }
        });
        thread.Start();
    }
    public void StopPdfGeneration()
    {
        lock (_lock)
        {
            _isRunning = false;
        }
    }
    private void GenerateDocument(string filePath)
    {
        // Load HTML content
        string htmlContent = "<html><body><h1>Hello, IronPDF!</h1></body></html>";
        // Convert HTML to PDF
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(content);
        // Save PDF to file
        pdfDocument.SaveAs(filePath);
        // Output status
        Console.WriteLine($"PDF generated and saved to {filePath}");
    }
}
class Program
{
    static void Main(string[] args)
    {
        PdfGenerator pdfGenerator = new PdfGenerator();
        // Start PDF generation
        pdfGenerator.GeneratePdf("output.pdf");
        // Wait for user input to stop PDF generation
        Console.WriteLine("Press any key to stop PDF generation...");
        Console.ReadKey();
        // Stop PDF generation
        pdfGenerator.StopPdfGeneration();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

volatile bool isRunning: Designamos un campo isRunning como una variable volatile para indicar la posibilidad de que varios hilos realicen cambios en él. Este campo gestiona la generación del documento PDF. La creación del PDF continúa si isRunning es verdadero; si no, abandona.

GeneratePdf(string filePath): Esta función inicia un nuevo hilo que crea documentos PDF en un horario programado. Verificamos continuamente el indicador isRunning dentro del hilo principal. Si es así, utilizamos IronPDF para crear un documento PDF y guardarlo en el directorio de archivos designado.

StopPdfGeneration(): Esta función permite detener la creación de PDFs. Para mantener la seguridad de hilo al cambiar el indicador isRunning, se bloquea en un objeto privado llamado lock.

GenerateDocument(string filePath): Esta función contiene el código necesario para utilizar IronPDF y crear un documento PDF. Se crea una instancia de HtmlToPdf, se carga la información HTML, se convierte en un documento PDF y se guarda el PDF en el directorio de archivos designado.

Main(string[] args): Se instancia la clase PdfGenerator, se inicia la generación de PDF y se solicita al usuario que detenga la generación de PDF presionando cualquier tecla en el método Main.

C# Volatile (Cómo Funciona para Desarrolladores): Figura 5

Este ejemplo muestra cómo generar documentos PDF de manera confiable en un entorno multihilo utilizando IronPDF y la palabra clave volatile. Controlamos eficazmente el proceso de creación de PDF utilizando volatile para asegurar que los cambios en el indicador isRunning sean inmediatamente visibles a través de los hilos. También usamos un bloqueo para acceder y modificar la bandera isRunning mientras preservamos la seguridad de los hilos de trabajo.

C# Volátil (Cómo funciona para desarrolladores): Figura 6

Conclusión

En resumen, la incorporación de la palabra clave volatile en IronPDF ofrece una forma sólida de garantizar la seguridad de hilos al crear PDFs en programas C# multihilos. Garantizamos el conocimiento oportuno y la sincronización adecuada de los cambios en los subprocesos mediante la designación de indicadores de control compartidos como volátiles, lo que proporciona un control eficaz sobre el proceso de producción de PDF.

Al garantizar que los cambios en las banderas de control se transmitan instantáneamente a todos los hilos, volatile se utiliza para evitar conflictos y promover una coordinación eficiente de los procesos involucrados en la creación de PDF.

Las aplicaciones pueden gestionar eficazmente numerosos procesos de generación de PDF de forma concurrente sin correr el riesgo de corrupción de datos o situaciones de carrera, gracias a este enfoque, que mejora la escalabilidad y la fiabilidad de la generación de PDF en contextos concurrentes.

Finalmente, puedes trabajar eficientemente con códigos de barras, crear PDFs, realizar OCR y conectarte con Excel al incluir IronPDF y explorar todo el potencial de las bibliotecas de Iron Software con facilidad. Iron Software combina sin esfuerzo el rendimiento, la compatibilidad y la facilidad de uso de su versátil suite para ofrecer capacidades mejoradas de aplicación y un desarrollo más efectivo.

Los desarrolladores pueden elegir el mejor modelo con confianza si existen opciones de licencia claras y adaptadas a las necesidades particulares del proyecto. Estas ventajas permiten a los desarrolladores abordar con eficacia y transparencia diversos retos.

Chipego
Ingeniero de software
Chipego tiene una habilidad natural para escuchar que le ayuda a comprender los problemas de los clientes y a ofrecer soluciones inteligentes. Se unió al equipo de Iron Software en 2023, después de estudiar una licenciatura en Tecnología de la Información. IronPDF e IronOCR son los dos productos en los que Chipego se ha centrado, pero su conocimiento de todos los productos crece día a día, a medida que encuentra nuevas formas de ayudar a los clientes. Disfruta de lo colaborativa que es la vida en Iron Software, con miembros del equipo de toda la empresa que aportan su variada experiencia para contribuir a soluciones eficaces e innovadoras. Cuando Chipego está lejos de su escritorio, a menudo se le puede encontrar disfrutando de un buen libro o jugando al fútbol.
< ANTERIOR
C# TryParse (Cómo funciona para desarrolladores)
SIGUIENTE >
C# Task.Run (Cómo Funciona Para Desarrolladores)