Altbilgi içeriğine atla
.NET YARDıM

C# Eşzamanlı Liste (Geliştiriciler İçin Nasıl Çalışır)

Paylaşılan bir kaynağa erişim için mücadele eden birden fazla iş parçacığınız varsa, iş parçacığı güvenli implementasyonun bir oyun olmadığını bilirsiniz. Ancak, endişelenmeyin! C#, iş parçacığı güvenliğini şıklık ve zarafetle sağlayan güçlü bir dizi iş parçacığı güvenli, genel koleksiyon sınıfları olan eşzamanlı koleksiyonlar ile sizi korur.

Thread Safety and Concurrent Collections in C

Haydi, trafik lambaları olmayan kalabalık bir şehir kavşağını hayal edin. Kaosu hayal edebilirsiniz! Bu, bir sistem olmadan birden fazla iş parçacığının aynı kaynağı eşzamanlı olarak erişmeye çalıştığında olanlara benzerdir. Neyse ki, C# dilinde, iş parçacıklarımız için trafik lambaları var - bunlara eşzamanlı koleksiyonlar denir. Bunlar, aynı anda yalnızca bir iş parçacığının bir kaynağa erişmesine izin veren koleksiyon sınıflarıdır. Bu iş parçacığı güvenliği, birden fazla iş parçacığı ile çalışırken çok önemlidir.

Exploring Concurrent Thread Safe Collections in C

C# dilinde, System.Collections.Concurrent isim alanı, ConcurrentDictionary, ConcurrentQueue, ConcurrentStack ve ConcurrentBag gibi çeşitli eşzamanlı koleksiyon sınıflarına sahiptir. Bu sırasız koleksiyon sınıfları, eşzamanlı olmayan muadillerinin iş parçacığı güvenli versiyonunu sunar. Eşzamanlı koleksiyonları diğerlerinden ayıran şey, onların sırasız eşzamanlı koleksiyonlar olmasıdır, yani öğeler belirli bir sıraya sahip değildir. Örneğin, bir eşzamanlı liste ile, bir öğenin tam olarak nereye yerleştirileceğini bilemezsiniz. Odak noktası iş parçacığı güvenliğini sağlamak, düzeni korumak değil.

Gerçek hayattan bir örnek vermek gerekirse. Bir web sitesinde şifre gönderme gönderisini düşünün. Eşzamanlı bir koleksiyonla, birden fazla kullanıcı şifrelerini aynı anda gönderebilir. Her 'gönder' eylemi bir iş parçacığı gibidir ve eşzamanlı koleksiyon her gönderimin iş parçacığı güvenliği altında etkili ve güvenli bir şekilde işlenmesini sağlar.

ConcurrentDictionary: Gerçek Dünya Örneği

Şimdi, gerçek dünya örneğiyle ConcurrentDictionary koleksiyon sınıfını inceleyelim. Bir çevrimiçi kitapçıyı ve öneri özelliğini hayal edin. Her bir kullanıcının tıklaması, öneri listelerine eklenen bir kitap anlamına gelir, bu da bir sözlük tarafından temsil edilir. Birden fazla kullanıcı aynı anda kitaplara göz attığında ve tıkladığında, sözlüğe eşzamanlı olarak birden çok iş parçacığı erişir.

C# dilinde bir ConcurrentDictionary şöyle görünebilir:

using System.Collections.Concurrent;

ConcurrentDictionary<string, string> recommendedBooks = new ConcurrentDictionary<string, string>();
using System.Collections.Concurrent;

ConcurrentDictionary<string, string> recommendedBooks = new ConcurrentDictionary<string, string>();
Imports System.Collections.Concurrent

Private recommendedBooks As New ConcurrentDictionary(Of String, String)()
$vbLabelText   $csharpLabel

Bir kullanıcının tüm öneri koleksiyonuna bir kitap eklemek için TryAdd yöntemini kullanabiliriz:

public void Insert(string user, string book)
{
    // Try to add the book to the user's recommendations
    recommendedBooks.TryAdd(user, book);
}
public void Insert(string user, string book)
{
    // Try to add the book to the user's recommendations
    recommendedBooks.TryAdd(user, book);
}
Public Sub Insert(ByVal user As String, ByVal book As String)
	' Try to add the book to the user's recommendations
	recommendedBooks.TryAdd(user, book)
End Sub
$vbLabelText   $csharpLabel

Bu senaryoda, ConcurrentDictionary koleksiyon sınıfı, her tıklamanın ('thread') tek tek ele alınmasını sağlar, böylece iki kullanıcının önerileri birbirine karışmaz. Tüm 'thread' güvenliğini halleder, bu yüzden veri yarışmaları ve çoklu 'thread' ile ilgili diğer eşzamanlılık sorunları hakkında endişelenmenize gerek kalmaz.

İş Parçacığı Güvenli İşlemleri Uygulamak

TryAdd dışında, C# dilinde eşzamanlı koleksiyonlar, TryRemove ve TryUpdate gibi çeşitli diğer 'thread' güvenli operasyonlar sunar. Bu yöntemler, bir seferde yalnızca bir 'thread'in işlem yapabileceğini garanti eder. Örneğin, önceki örnekte bir kullanıcının önerilerinden bir kitabı kaldırmak isteseydik, TryRemove yöntemini kullanabilirdik:

public void RemoveAt(string user)
{
    // Attempt to remove the book for the specified user
    string removedBook;
    recommendedBooks.TryRemove(user, out removedBook);
}
public void RemoveAt(string user)
{
    // Attempt to remove the book for the specified user
    string removedBook;
    recommendedBooks.TryRemove(user, out removedBook);
}
Public Sub RemoveAt(ByVal user As String)
	' Attempt to remove the book for the specified user
	Dim removedBook As String = Nothing
	recommendedBooks.TryRemove(user, removedBook)
End Sub
$vbLabelText   $csharpLabel

TryRemove yöntemi, sağlanan anahtarın (bu durumda bir kullanıcı) değerini kaldırmaya çalışacak ve bunu removedBook değişkenine koyacaktır.

Eşzamanlı Koleksiyonları Kopyalamak

Şimdi, diyelim ki eşzamanlı koleksiyonunuzu bir diziye kopyalamak istiyorsunuz. Eşzamanlı koleksiyonlar, bu amaç için tam olarak bir CopyTo yöntemi sunar:

public void CopyTo()
{
    // Create an array to hold the recommended books
    string[] bookArray = new string[recommendedBooks.Count];

    // Copy the values of the concurrent dictionary to the array
    recommendedBooks.Values.CopyTo(bookArray, 0);
}
public void CopyTo()
{
    // Create an array to hold the recommended books
    string[] bookArray = new string[recommendedBooks.Count];

    // Copy the values of the concurrent dictionary to the array
    recommendedBooks.Values.CopyTo(bookArray, 0);
}
Public Sub CopyTo()
	' Create an array to hold the recommended books
	Dim bookArray(recommendedBooks.Count - 1) As String

	' Copy the values of the concurrent dictionary to the array
	recommendedBooks.Values.CopyTo(bookArray, 0)
End Sub
$vbLabelText   $csharpLabel

Burada, CopyTo yöntemi, recommendedBooks eşzamanlı sözlüğünden tüm kitapları (değerleri) bookArray içine kopyalar.

İş Parçacığı Güvenli Koleksiyon

C# ayrıca iş parçacığı güvenli koleksiyonlar sağlar, bu koleksiyonlar, çok iş parçacıklı ortamlarda paylaşılan kaynaklara güvenli erişim sağlamak için tasarlanmıştır. ConcurrentBag, ConcurrentQueue ve ConcurrentStack gibi bu koleksiyonlar, birden fazla 'thread'in koleksiyona aynı anda erişip değişiklik yapabilmesini, çatışma veya veri bozulması olmadan sağlayan 'thread' güvenli uygulamalar sunar.

Tutarlılığı ve bütünlüğü içsel olarak senkronizasyonu ele alarak garanti ederler, bu da sırasız bir koleksiyonun yeterli olduğu ve iş parçacığı güvenliğinin en ön planda olduğu senaryolar için idealdir.

IronPDF Hakkında Daha Fazla Bilgi Edinin, HTML'den PDF belgelerini zahmetsizce oluşturmanıza olanak tanıyan popüler bir C# kütüphanesidir.

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
Imports IronPdf

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim renderer = New ChromePdfRenderer()

		' 1. Convert HTML String to PDF
		Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
		Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
		pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")

		' 2. Convert HTML File to PDF
		Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
		Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
		pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")

		' 3. Convert URL to PDF
		Dim url = "http://ironpdf.com" ' Specify the URL
		Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
		pdfFromUrl.SaveAs("URLToPDF.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

Başlangıçta eşzamanlı listelerle doğrudan ilgili görünmese de, IronPDF eşzamanlı koleksiyon işlemlerinizi tamamlama işlevi görebilir ve eşzamanlı veri işleme sonuçlarınızı yakalamak için kolay bir yol sağlayabilir.

Yoğun veri işleme gerçekleştiren çok iş parçacıklı bir uygulamanızın olduğunu düşünün. İş parçacıkları veriler üzerinde çalışırken, sonuçları yakalamak ve daha fazla analiz veya kayıt tutma için bir PDF raporu oluşturmak isteyebilirsiniz. İşte burada IronPDF devreye giriyor.

IronPDF kullanmak, kütüphaneyi projenize eklemek ve kullanışlı API'sini kullanmak kadar basittir. İşte IronPDF'ü eşzamanlı koleksiyon işlemlerinizle nasıl entegre edebileceğinize dair bir örnek:

using IronPdf;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading.Tasks;

// Create a concurrent dictionary to hold your processed data
ConcurrentDictionary<int, string> processedData = new ConcurrentDictionary<int, string>();

// Define your data list (replace with your actual data source)
List<DataItem> dataList = GetDataList();

// Process your data concurrently and store the results in the dictionary
Parallel.ForEach(dataList, (dataItem) =>
{
    // Process each data item and add the result to the dictionary
    string processedResult = ProcessDataItem(dataItem);
    processedData.TryAdd(dataItem.Id, processedResult);
});

// Generate a PDF report with the processed data
var renderer = new ChromePdfRenderer();
var pdfDocument = renderer.RenderHtmlAsPdf(BuildHtmlReport(processedData));
pdfDocument.SaveAs("C:\\processed_data_report.pdf");

// Method to retrieve the data list (replace with your actual data source logic)
List<DataItem> GetDataList()
{
    List<DataItem> dataList = new List<DataItem>()
    {
        new DataItem { Id = 1, Name = "Item 1" },
        new DataItem { Id = 2, Name = "Item 2" },
        new DataItem { Id = 3, Name = "Item 3" },
        new DataItem { Id = 4, Name = "Item 4" }
    };
    return dataList;
}

// Method to process each data item and return the result (replace with your actual data processing logic)
string ProcessDataItem(DataItem dataItem)
{
    // Simulating data processing with a delay
    Task.Delay(100).Wait();
    return $"Processed: {dataItem.Name}";
}

// Method to build the HTML report using the processed data (replace with your actual reporting logic)
string BuildHtmlReport(ConcurrentDictionary<int, string> processedData)
{
    string html = "<h1>Processed Data Report</h1><ul>";
    foreach (var kvp in processedData)
    {
        html += $"<li>Item {kvp.Key}: {kvp.Value}</li>";
    }
    html += "</ul>";
    return html;
}

// Placeholder class for your data item (replace with your actual data item class)
public class DataItem
{
    public int Id { get; set; }
    public string Name { get; set; }
    // Add other properties as needed
}
using IronPdf;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading.Tasks;

// Create a concurrent dictionary to hold your processed data
ConcurrentDictionary<int, string> processedData = new ConcurrentDictionary<int, string>();

// Define your data list (replace with your actual data source)
List<DataItem> dataList = GetDataList();

// Process your data concurrently and store the results in the dictionary
Parallel.ForEach(dataList, (dataItem) =>
{
    // Process each data item and add the result to the dictionary
    string processedResult = ProcessDataItem(dataItem);
    processedData.TryAdd(dataItem.Id, processedResult);
});

// Generate a PDF report with the processed data
var renderer = new ChromePdfRenderer();
var pdfDocument = renderer.RenderHtmlAsPdf(BuildHtmlReport(processedData));
pdfDocument.SaveAs("C:\\processed_data_report.pdf");

// Method to retrieve the data list (replace with your actual data source logic)
List<DataItem> GetDataList()
{
    List<DataItem> dataList = new List<DataItem>()
    {
        new DataItem { Id = 1, Name = "Item 1" },
        new DataItem { Id = 2, Name = "Item 2" },
        new DataItem { Id = 3, Name = "Item 3" },
        new DataItem { Id = 4, Name = "Item 4" }
    };
    return dataList;
}

// Method to process each data item and return the result (replace with your actual data processing logic)
string ProcessDataItem(DataItem dataItem)
{
    // Simulating data processing with a delay
    Task.Delay(100).Wait();
    return $"Processed: {dataItem.Name}";
}

// Method to build the HTML report using the processed data (replace with your actual reporting logic)
string BuildHtmlReport(ConcurrentDictionary<int, string> processedData)
{
    string html = "<h1>Processed Data Report</h1><ul>";
    foreach (var kvp in processedData)
    {
        html += $"<li>Item {kvp.Key}: {kvp.Value}</li>";
    }
    html += "</ul>";
    return html;
}

// Placeholder class for your data item (replace with your actual data item class)
public class DataItem
{
    public int Id { get; set; }
    public string Name { get; set; }
    // Add other properties as needed
}
Imports IronPdf
Imports System.Collections.Concurrent
Imports System.Collections.Generic
Imports System.Threading.Tasks

' Create a concurrent dictionary to hold your processed data
Private processedData As New ConcurrentDictionary(Of Integer, String)()

' Define your data list (replace with your actual data source)
Private dataList As List(Of DataItem) = GetDataList()

' Process your data concurrently and store the results in the dictionary
Parallel.ForEach(dataList, Sub(dataItem)
	' Process each data item and add the result to the dictionary
	Dim processedResult As String = ProcessDataItem(dataItem)
	processedData.TryAdd(dataItem.Id, processedResult)
End Sub)

' Generate a PDF report with the processed data
Dim renderer = New ChromePdfRenderer()
Dim pdfDocument = renderer.RenderHtmlAsPdf(BuildHtmlReport(processedData))
pdfDocument.SaveAs("C:\processed_data_report.pdf")

' Method to retrieve the data list (replace with your actual data source logic)
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'List(Of DataItem) GetDataList()
'{
'	List<DataItem> dataList = New List<DataItem>() { New DataItem { Id = 1, Name = "Item 1" }, New DataItem { Id = 2, Name = "Item 2" }, New DataItem { Id = 3, Name = "Item 3" }, New DataItem { Id = 4, Name = "Item 4" } };
'	Return dataList;
'}

' Method to process each data item and return the result (replace with your actual data processing logic)
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'string ProcessDataItem(DataItem dataItem)
'{
'	' Simulating data processing with a delay
'	Task.Delay(100).Wait();
'	Return string.Format("Processed: {0}", dataItem.Name);
'}

' Method to build the HTML report using the processed data (replace with your actual reporting logic)
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'string BuildHtmlReport(ConcurrentDictionary(Of int, string) processedData)
'{
'	string html = "<h1>Processed Data Report</h1><ul>";
'	foreach (var kvp in processedData)
'	{
'		html += string.Format("<li>Item {0}: {1}</li>", kvp.Key, kvp.Value);
'	}
'	html += "</ul>";
'	Return html;
'}

' Placeholder class for your data item (replace with your actual data item class)
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'public class DataItem
'{
'	public int Id
'	{
'		get;
'		set;
'	}
'	public string Name
'	{
'		get;
'		set;
'	}
'	' Add other properties as needed
'}
$vbLabelText   $csharpLabel

Kodun çıktısı burada:

C# Concurrent List (Geliştiriciler İçin Nasıl Çalışır) Şekil 1 - Çıktı

Sonuç

Sonuç olarak, C# eşzamanlı koleksiyonlarını, özellikle eşzamanlı listeleri anlamak ve kullanmak, uygulamalarınızdaki çoklu iş parçacığı senaryolarını yönetme yeteneğinizi büyük ölçüde artırabilir ve iş parçacığı güvenliğini sağlar. Eşzamanlı koleksiyonlarla, paylaşılan kaynakları etkili bir şekilde yönetebilirsiniz, iş parçacıkları arasında veri yarışlarını ve çarpışmaları önleyebilirsiniz.

IronPDF gibi harici kütüphaneleri entegre etmek, eşzamanlı koleksiyonların işlevselliğini artırabilir ve görsel olarak çekici PDF raporları veya belgeleri oluşturmanızı sağlar. IronPDF, HTML'yi PDF'e dönüştürme kütüphanesinin ücretsiz denemesini sunarak yeteneklerini keşfetmenizi sağlar ve lisans seçenekleri $999'den başlamaktadır.

Sıkça Sorulan Sorular

C#'ta eşzamanlı koleksiyonlar nedir?

C#'ta eşzamanlı koleksiyonlar, birden fazla iş parçacığı paylaşılan kaynaklara eriştiğinde iş parçacığı güvenliğini sağlayan, iş parçacığı güvenli, genellikle kullanılabilir koleksiyon sınıfları setidir.

C#'ta iş parçacığı güvenliği neden önemlidir?

C#'ta iş parçacığı güvenliği, birden fazla iş parçacığı aynı anda paylaşılan kaynaklara erişip bunları değiştirdiğinde kargaşa ve veri bozulmasını önlemek için kritik öneme sahiptir. İşlemlerin kontrol altında bir şekilde yürütülmesini sağlar.

C#'ta iş parçacığı güvenli bir listeyi nasıl oluşturabilirim?

C#, doğrudan iş parçacığı güvenli Liste sınıfını sağlamamaktadır; ancak benzer iş parçacığı güvenli işlemler için `ConcurrentBag` veya `ConcurrentDictionary` gibi diğer eşzamanlı koleksiyonları kullanabilirsiniz.

C#'ta ConcurrentDictionary nedir?

C#'ta ConcurrentDictionary, `System.Collections.Concurrent` ad alanı içinde bir iş parçacığı güvenli koleksiyon sınıfıdır. Birden fazla iş parçacığının eşzamanlı olarak güvenli bir şekilde anahtar-değer çiftleri eklemesine, güncellemesine ve kaldırmasına olanak tanır.

ConcurrentDictionary iş parçacığı güvenliğini nasıl sağlar?

ConcurrentDictionary, sadece bir iş parçacığının aynı anda öğe ekleme veya kaldırma gibi işlemleri gerçekleştirmesine izin vererek içsel senkronizasyonu kendi içinde yaparak iş parçacığı güvenliğini sağlar.

ConcurrentDictionary'ye bir öğe nasıl ekleyebilirsiniz?

ConcurrentDictionary'ye bir öğe, anahtarın sözlükte daha önceden var olmaması durumunda bir anahtar-değer çiftini eklemeye çalışan TryAdd yöntemi kullanılarak eklenebilir.

Eşzamanlı koleksiyonlardaki CopyTo yönteminin amacı nedir?

Eşzamanlı koleksiyonlardaki CopyTo yöntemi, koleksiyonun elemanlarını bir diziye kopyalamak için kullanılır, koleksiyondan başka bir depolama biçimine veri aktarmanın bir yolunu sağlar.

IronPDF, işlenen verilerden PDF raporları oluşturmak için kullanılabilir mi?

Evet, IronPDF, çoklu iş parçacıklı uygulamalar tarafından işlenen verilerden PDF raporları oluşturmak için kullanılabilir, eşzamanlı işlemlerin sonuçlarını kaydeder.

IronPDF kullanarak eşzamanlı operasyonların işlevselliği nasıl artırılır?

IronPDF, işlenen verilerden PDF belgeleri oluşturarak eşzamanlı operasyonları artırır, çoklu iş parçacıklı işlem sonuçlarını belgelemek ve paylaşmak için bir yol sunar.

IronPDF, çoklu iş parçacıklı C# uygulamalarında hangi rolü oynar?

IronPDF, paralel şekilde işlenen verilerden PDF raporları oluşturmaya olanak tanır, çoklu iş parçacıklı operasyonlardan sonuçları birleştirmek ve paylaşmayı kolaylaştırır.

Jacob Mellor, Teknoloji Direktörü @ Team Iron
Teknoloji Direktörü

Jacob Mellor, Iron Software'de Baş Teknoloji Yöneticisidir ve C# PDF teknolojisinde öncü bir mühendisdir. Iron Software'ın ana kod tabanının ilk geliştiricisi olarak, CEO Cameron Rimington ile birlikte şirketin ürün mimarisini 50'den fazla kişilik bir şirkete dönüştürmüştür ...

Daha Fazla Oku

Iron Destek Ekibi

Haftada 5 gün, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara