Ir para o conteúdo do rodapé
AJUDA DO .NET

C# Volátil (Como funciona para desenvolvedores)

A palavra-chave volatile em C# é usada para sinalizar que um campo pode ser atualizado por threads executadas simultaneamente. Um campo marcado como volátil alerta o compilador e o ambiente de execução sobre a possibilidade de que threads concorrentes ou outros componentes do programa possam alterar o valor do campo sem aviso prévio. Isso garante que os acessos à memória desse campo não serão otimizados pelo compilador, o que poderia causar comportamento inesperado em [aplicações multithread](https://en.wikipedia.org/wiki/Multithreading_(computer_architecture) .

Uma biblioteca C# bastante popular para criar e modificar documentos PDF é chamada IronPDF - .NET PDF Library . Saber como utilizar a palavra-chave volatile adequadamente é crucial ao trabalhar com aplicativos multithread ou programas que usam o IronPDF para criação ou manipulação de PDFs. Isso ajudará a garantir que os dados estejam devidamente sincronizados e consistentes quando várias threads acessarem os mesmos.

Este tutorial abordará as melhores maneiras de usar o IronPDF e a palavra-chave volatile para criar aplicativos multithread confiáveis ​​que geram ou manipulam PDFs. Vamos abordar os usos comuns de campos voláteis, como declarar e utilizar campos voláteis corretamente e as práticas recomendadas para garantir que seus aplicativos com IronPDF sejam thread-safe. Vamos começar!

Como usar o recurso Volátil em C

  1. Importe as bibliotecas necessárias.
  2. Declare uma variável volátil.
  3. Iniciar a tarefa de geração de PDF.
  4. Defina a variável volátil na tarefa.
  5. Verificar variável volátil.
  6. Aguarde a geração do PDF.
  7. Gerenciar o preenchimento automático de PDFs.

O que é Volatile em C#?

A declaração de um campo que pode ser alterado por várias threads executadas simultaneamente é feita com o uso da palavra-chave volatile. Quando um campo é designado como volátil, o compilador e o ambiente de execução são alertados de que outros componentes do programa, incluindo threads concorrentes, podem modificar seu valor sem aviso prévio. Por esse motivo, as operações de leitura e escrita em campos voláteis são sempre realizadas diretamente na memória principal.

A palavra-chave volatile aborda questões relacionadas à reordenação de operações de memória, impondo barreiras de memória. Uma barreira de memória garante que as operações de memória não sejam reordenadas em acessos voláteis, evitando comportamentos inesperados em cenários multithread.

Ao empregar barreiras de memória implicitamente antes e depois de operações de leitura volátil ou durante operações de escrita volátil, volatile garante a ordem correta das operações de memória, aprimorando a segurança de threads e a consistência de dados em ambientes concorrentes, ao contrário dos problemas que poderiam surgir ao usar qualquer objeto não volátil.

Objetivo da palavra-chave volátil

A palavra-chave volatile em C# é usada principalmente para lidar com situações em que várias threads se sincronizam incorretamente para acessar e modificar o local de memória de dados compartilhados. Em ambientes multithread, o compilador pode otimizar os acessos à memória de uma forma que pode causar comportamento imprevisível se o modificador volatile não estiver presente.

Os desenvolvedores podem indicar ao compilador que o valor de um campo pode mudar de forma assíncrona e que a integridade dos dados exige acesso direto à memória, designando o campo como volátil.

Comportamento de palavras-chave voláteis

O compilador e o ambiente de execução garantem que toda operação de leitura e gravação de memória em um campo marcado como volátil evite o uso de quaisquer métodos de cache possíveis. Isso indica que o valor de um campo volátil será sempre buscado na memória principal em acessos subsequentes, mesmo que uma thread o armazene em cache, em vez de depender do mesmo valor após ele ter sido armazenado em cache. Da mesma forma, as modificações feitas por uma thread são visíveis para todas as outras threads que acessam o mesmo campo, uma vez que as escritas em um campo volátil são propagadas instantaneamente para a memória.

Utilizando Volatile para Estado Compartilhado

Vamos usar alguns exemplos de código para demonstrar como usar a palavra-chave 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();
    }
}
Imports System
Imports System.Threading

Friend Class SharedStateExample
'INSTANT VB TODO TASK: There is no VB equivalent to 'volatile':
'ORIGINAL LINE: private volatile bool _isRunning = true;
	Private _isRunning As Boolean = True

	Public Sub Run()
		Dim thread1 As New Thread(AddressOf ChangeState)
		Dim thread2 As New Thread(AddressOf ReadState)
		thread1.Start()
		thread2.Start()
	End Sub

	Private Sub ChangeState()
		Do While _isRunning
			Console.WriteLine("Changing state...")
			Thread.Sleep(1000)
			_isRunning = False
		Loop
	End Sub

	Private Sub ReadState()
		Do While _isRunning
			Console.WriteLine("Reading state...")
			Thread.Sleep(500)
		Loop
		Console.WriteLine("State is no longer running.")
	End Sub
End Class

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim example As New SharedStateExample()
		example.Run()
	End Sub
End Class
$vbLabelText   $csharpLabel

A classe SharedStateExample neste exemplo possui um campo _isRunning que está sinalizado como um objeto volátil. Um método ChangeState é criado para alterar o estado, e um método ReadState estabelece uma operação de leitura volátil.

Enquanto o método ReadState verifica continuamente o valor de _isRunning , o método ChangeState aguarda um pouco e, em seguida, define _isRunning como falso. As alterações feitas por apenas uma thread são instantaneamente visíveis para a outra thread devido à volatilidade de **_isRunning** .

Travamento com dupla verificação e volatilidade

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));
    }
}
Imports System

Friend Class Singleton
'INSTANT VB TODO TASK: There is no VB equivalent to 'volatile':
'ORIGINAL LINE: private static volatile Singleton _instance;
	Private Shared _instance As Singleton
	Private Shared ReadOnly _lock As New Object()

	Private Sub New()
	End Sub

	Public Shared Function GetInstance() As Singleton
		If _instance Is Nothing Then
			SyncLock _lock
				If _instance Is Nothing Then
					_instance = New Singleton()
				End If
			End SyncLock
		End If
		Return _instance
	End Function
End Class

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim instance1 As Singleton = Singleton.GetInstance()
		Dim instance2 As Singleton = Singleton.GetInstance()
		Console.WriteLine("Are instances equal? " & (instance1 Is instance2))
	End Sub
End Class
$vbLabelText   $csharpLabel

Neste exemplo, utilizamos um mecanismo de bloqueio com dupla verificação para construir um projeto Singleton thread-safe. Para garantir que as modificações feitas entre várias threads estejam atualizadas e visíveis, o campo _instance é designado como volátil. Isso evita situações em que uma única thread detecta uma instância Singleton que está apenas parcialmente inicializada. Mesmo em um contexto multithread, o mecanismo de bloqueio com dupla verificação garante que apenas uma instância do Singleton seja produzida.

O que é o IronPDF?

A biblioteca C# IronPDF - PDF Generation and Editing permite que programadores criem, modifiquem e renderizem documentos PDF dentro de aplicações .NET . Seu conjunto abrangente de recursos facilita o trabalho com arquivos PDF. Documentos PDF já existentes podem ser editados, divididos e mesclados. Documentos PDF podem ser criados em HTML, imagens e outros formatos. Os arquivos PDF podem conter anotações de texto, fotos e outros dados.

Funcionalidades do IronPDF

Anotação de texto e imagem

Com o IronPDF, você pode adicionar anotações programáticas a documentos PDF com texto, imagens e outros dados. Com esta ferramenta, você pode adicionar anotações, carimbos e comentários a arquivos PDF.

Segurança de PDF

O IronPDF permite especificar diferentes permissões, incluindo impressão, cópia e edição do documento, e pode criptografar documentos PDF com senhas. Isso ajuda a controlar quem tem acesso aos arquivos PDF e a proteger informações confidenciais.

Preenchimento de formulários PDF interativos

Com o IronPDF, formulários PDF interativos podem ser preenchidos programaticamente. Essa funcionalidade é útil para criar documentos personalizados com base nas informações inseridas pelo usuário e para automatizar o envio de formulários.

Compressão e otimização de PDF

O IronPDF oferece opções para otimização e compressão de arquivos PDF, minimizando o tamanho sem sacrificar a qualidade. Como resultado, os documentos PDF exigem menos espaço de armazenamento e operam com maior eficiência.

Compatibilidade entre plataformas

O IronPDF foi projetado para funcionar perfeitamente com programas .NET em diversos sistemas operacionais, incluindo Windows, Linux e macOS. Frameworks .NET conhecidos como ASP.NET, .NET Core e Xamarin estão integrados a ele.

Criar um novo projeto do Visual Studio

Criar um projeto de console no Visual Studio é um processo simples. Para iniciar um aplicativo de console, siga estes passos simples no ambiente do Visual Studio:

Antes de usar o Visual Studio, certifique-se de que ele esteja instalado em seu computador.

Iniciar um novo projeto

Selecione Arquivo, depois Novo e, por último, Projeto.

C# Volátil (Como funciona para desenvolvedores): Figura 1

Na caixa "Criar um novo projeto", selecione a linguagem de programação de sua preferência (C#, por exemplo) na lista à esquerda.

A lista de referência de modelos de projeto a seguir tem o modelo "Aplicativo de Console" ou "Aplicativo de Console (.NET Core)" disponível para seleção.

Dê um nome ao seu projeto no campo "Nome".

C# Volátil (Como funciona para desenvolvedores): Figura 2

Selecione o local onde o projeto será armazenado.

Clicar em "Criar" iniciará o projeto do aplicativo de console.

C# Volátil (Como funciona para desenvolvedores): Figura 3

Instalando o IronPDF

O item de menu Ferramentas do Visual Studio, localizado em Ferramentas, contém a interface de linha de comando do Visual Studio. Selecione o Gerenciador de Pacotes NuGet . Na aba do terminal de gerenciamento de pacotes, você deve digitar o seguinte comando.

Install-Package IronPdf

Alternativamente, você pode usar o Gerenciador de Pacotes. É possível instalar o pacote diretamente na solução usando a opção Gerenciador de Pacotes NuGet . Utilize a caixa de pesquisa do site do NuGet Manager para localizar pacotes. A captura de tela a seguir mostra como é fácil pesquisar por "IronPDF" no gerenciador de pacotes:

C# Volátil (Como funciona para desenvolvedores): Figura 4 - Instalando o IronPDF a partir do gerenciador de pacotes NuGet

Os resultados relevantes da pesquisa são exibidos na imagem acima. Faça as seguintes alterações para que o software seja instalado mais facilmente em seu computador.

Após baixar e instalar o pacote, podemos agora utilizá-lo no projeto em andamento.

Garantindo a segurança de threads na geração de PDFs com C# Volatile e IronPDF

Agora vamos usar o IronPDF e a palavra-chave volatile juntos em um programa C#. Uma biblioteca C# bastante popular para criar e modificar documentos PDF é chamada IronPDF. A segurança de threads deve ser mantida ao trabalhar com aplicativos multithread que utilizam o IronPDF para criação ou processamento de PDFs.

Aqui está um exemplo que mostra como utilizar a palavra-chave volatile do IronPDF para criar documentos PDF em um ambiente multithread.

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(htmlContent);
        // 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(htmlContent);
        // 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();
    }
}
Imports IronPdf
Imports System
Imports System.Threading

Friend Class PdfGenerator
'INSTANT VB TODO TASK: There is no VB equivalent to 'volatile':
'ORIGINAL LINE: private volatile bool _isRunning = true;
	Private _isRunning As Boolean = True
	Private ReadOnly _lock As New Object()

	Public Sub GeneratePdf(ByVal filePath As String)
		Dim thread As New Thread(Sub()
			Do While _isRunning
				' Generate PDF document
				GenerateDocument(filePath)
				' Sleep for some time
				System.Threading.Thread.Sleep(5000)
			Loop
		End Sub)
		thread.Start()
	End Sub

	Public Sub StopPdfGeneration()
		SyncLock _lock
			_isRunning = False
		End SyncLock
	End Sub

	Private Sub GenerateDocument(ByVal filePath As String)
		' Load HTML content
		Dim htmlContent As String = "<html><body><h1>Hello, IronPDF!</h1></body></html>"
		' Convert HTML to PDF
		Dim renderer = New ChromePdfRenderer()
		Dim pdfDocument = renderer.RenderHtmlAsPdf(htmlContent)
		' Save PDF to file
		pdfDocument.SaveAs(filePath)
		' Output status
		Console.WriteLine($"PDF generated and saved to {filePath}")
	End Sub
End Class

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim pdfGenerator As 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()
	End Sub
End Class
$vbLabelText   $csharpLabel

volatile bool isRunning: Designamos um campo _isRunning como uma variável volátil para indicar a possibilidade de várias threads fazerem alterações nele. Este campo gerencia a geração do documento PDF. A criação do PDF continua se _isRunning for verdadeiro; Caso contrário, ele desiste.

GeneratePdf(string filePath): Esta função inicia uma nova thread que cria documentos PDF de acordo com um agendamento. Verificamos continuamente o sinalizador _isRunning dentro da thread principal. Nesse caso, usamos o IronPDF para criar um documento PDF e salvá-lo no diretório de arquivos designado.

StopPdfGeneration(): Esta função permite interromper a criação de PDFs. Para manter a segurança de threads durante a alteração do sinalizador _isRunning, ele bloqueia um objeto privado chamado _lock.

GenerateDocument(string filePath): Esta função contém o código necessário para usar o IronPDF para criar um documento PDF. Uma instância de ChromePdfRenderer é criada, o conteúdo HTML é carregado, convertido em um documento PDF e o PDF é salvo no diretório de arquivos designado.

Main(string[] args): A classe PdfGenerator é instanciada, a geração do PDF é iniciada e o usuário é solicitado a interromper a geração do PDF pressionando qualquer tecla no método Main.

C# Volátil (Como funciona para desenvolvedores): Figura 5

Este exemplo mostra como gerar documentos PDF de forma confiável em um ambiente multithread usando o IronPDF e a palavra-chave volatile. Controlamos efetivamente o processo de criação de PDFs utilizando volatile para garantir que as alterações no sinalizador _isRunning sejam imediatamente visíveis em todas as threads. Também utilizamos um bloqueio para acessar e modificar o sinalizador _isRunning, preservando a segurança da thread de trabalho.

C# Volátil (Como funciona para desenvolvedores): Figura 6

Conclusão

Em resumo, a incorporação da palavra-chave volatile no IronPDF oferece uma maneira robusta de garantir a segurança de threads durante a criação de PDFs em programas C# multithread. Garantimos a detecção oportuna e a sincronização adequada das alterações entre as threads, designando os indicadores de controle compartilhados como voláteis, proporcionando um controle eficaz sobre o processo de produção de PDFs.

Ao garantir que as alterações nos sinalizadores de controle sejam transmitidas instantaneamente para todas as threads, volatile é usado para evitar conflitos e promover a coordenação eficiente dos processos envolvidos na criação de PDFs.

Graças a essa abordagem, os aplicativos podem gerenciar com eficiência vários processos de geração de PDF simultaneamente, sem correr o risco de corrupção de dados ou situações de corrida, o que melhora a escalabilidade e a confiabilidade da geração de PDF em contextos concorrentes.

Finalmente, você pode trabalhar de forma eficiente com códigos de barras, criar PDFs, realizar OCR e conectar-se ao Excel incluindo o IronPDF e explorar todo o potencial das bibliotecas da Iron Software com facilidade. A Iron Software combina, sem esforço, o desempenho, a compatibilidade e a facilidade de uso de seu conjunto versátil para oferecer recursos aprimorados de aplicativos e um desenvolvimento mais eficaz.

Os desenvolvedores podem escolher o melhor modelo com confiança se houver opções de licenciamento claras e adaptadas às necessidades específicas do projeto. Essas vantagens permitem que os desenvolvedores abordem uma variedade de desafios de forma eficiente e transparente.

Perguntas frequentes

Como posso converter HTML para PDF em C#?

Você pode usar o método RenderHtmlAsPdf do IronPDF para converter strings HTML em PDFs. Você também pode converter arquivos HTML em PDFs usando o RenderHtmlFileAsPdf .

Qual é a finalidade da palavra-chave `volatile` em C#?

A palavra-chave `volatile` em C# é usada para indicar que um campo pode ser atualizado por threads executadas simultaneamente, garantindo que os acessos à memória não sejam otimizados pelo compilador, o que pode evitar comportamentos inesperados em aplicações multithread.

Como a palavra-chave `volatile` melhora a consistência dos dados em C#?

Ao marcar um campo como volátil, você impõe barreiras de memória que garantem que as operações de memória não sejam reordenadas entre acessos voláteis. Isso garante que as alterações no campo sejam imediatamente visíveis para todas as threads, aprimorando a consistência dos dados em ambientes concorrentes.

Quais são alguns usos comuns da palavra-chave volatile em C#?

Os usos comuns da palavra-chave volatile incluem campos que são acessados por várias threads sem a devida sincronização, garantindo que as alterações sejam imediatamente visíveis para todas as threads e evitando problemas de cache.

Como posso garantir a segurança de threads ao gerar PDFs em C#?

Use a palavra-chave `volatile` para gerenciar estados compartilhados em aplicações multithread e confie nos métodos thread-safe do IronPDF para lidar com a geração de PDFs, garantindo que a consistência e a sincronização dos dados sejam mantidas.

Quais recursos o IronPDF oferece para manipulação de documentos PDF em .NET?

O IronPDF oferece recursos como anotação de texto e imagem, segurança de PDF, preenchimento interativo de formulários, compressão e otimização de PDF e compatibilidade multiplataforma com aplicativos .NET.

Como instalar uma biblioteca de manipulação de PDF em um projeto do Visual Studio?

Você pode instalar o IronPDF em um projeto do Visual Studio usando o Gerenciador de Pacotes NuGet. Execute o Install-Package IronPDF no Console do Gerenciador de Pacotes ou pesquise por IronPDF no Gerenciador de Pacotes NuGet e instale-o diretamente.

Como funcionam as barreiras de memória com a palavra-chave volatile?

As barreiras de memória em tipos voláteis impedem a reordenação das operações de memória entre acessos voláteis, garantindo que todas as threads vejam as operações na ordem correta e, assim, mantendo a consistência dos dados e a segurança das threads.

O que é um Singleton thread-safe em C# e como o volatile pode ajudar?

Um Singleton thread-safe pode ser criado usando `volatile`, marcando a variável de instância como `volatile` e utilizando um mecanismo de bloqueio com dupla verificação para garantir que apenas uma instância seja criada, mesmo em um contexto multithread.

Por que o acesso direto à memória é importante em aplicações multithread?

O acesso direto à memória garante que o valor mais recente de um campo seja lido e gravado na memória principal, evitando problemas de dados desatualizados que podem ocorrer devido ao cache em aplicações multithread.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais

Equipe de suporte de ferro

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim