cuốn sách gpt4 ai đã làm

Toàn bộ dữ liệu cấu trúc theo luồng trong .NET

In lại Tác giả: Sahara Thời gian cập nhật: 25-12-2024 12:47:42 59 4
mua khóa gpt4 Nike

Mục lục
  • 1.Hàng đợi đồng thời
  • 2.ConcurrentStack
  • 3.Tuỳ theo thời gian
  • 4. Từ điển đồng thời
  • 5.Bộ chặn tập tin
  • 6. Danh sách bất kỳ
  • 7. Bộ sưu tập được đồng bộ hóa
  • 8. Đồng bộ hóaReadOnlyCollection
  • 9. Bộ sưu tập khóa được đồng bộ hóa

Trong đa luồng cài đặt, cấu trúc dữ liệu và toàn bộ luồng là khóa để đảm bảo tính chất tối ưu của dữ liệu và Tránh tình trạng chạy đua. Viết này sẽ giới thiệu cách sử dụng đơn giản và khả năng sử dụng của chúng trong .NET Core và .NET Framework.

1.Hàng đợi đồng thời

ConcurrentQueue được xếp hàng trước (FIFO) trên toàn bộ luồng. Dequeue mà không gây ra sự không nhất quán về dữ liệu.

Các tình huống áp dụng

  • model sản phẩm được sử dụng) chờ đợi để xử lý.
  • Nhiệm vụ kế hoạch: Thêm tác vụ vào hàng đợi và luồng công nhân nhận nhiệm vụ từ hàng đợi và thực thi nó

lợi thế.

  • Kết quả đồng thời của hoạt động: Hỗ trợ nhiều luồng để thực hiện các thao tác enqueue và dequeue cùng một lúc
  • Thiết kế không khóa: Việc sử dụng các thuật toán nội bộ không khóa sẽ tránh được sự cạnh tranh về khóa và cải thiện hiệu suất.
  • Dễ dàng sử dụng: Cung cấp API đơn giản, ý tưởng nhưxếp hàngThửDequeue

Có.

  • .NET Framework 4.0 trở lên
  • .NET Core 1.0 trở lên

Mẫu mã.

use System.Collections.Concurrent var queue = new ConcurrentQueue;(); var cts = new CancellationTokenSource(); var token = cts.Token; // Nhiệm vụ của nhà sản xuất var production = Task.Run(() => { for (int i = 0; i < 10; i++) { queue.Enqueue(i); Console.WriteLine($"Enqueued {i}"); Thread.Sleep(100); // Mô phỏng độ trễ sản xuất} }, token); // Nhiệm vụ tiêu dùng var Consumer = Task.Run(() => { while (!token.IsCancellationRequested) { if (queue.TryDequeue(out int result)) { Console.WriteLine($"Dequeued {result}"); } Thread.Sleep(50); }, token); đang chờ Task.WhenAll(producer); cts.Cancel(); // Dừng tác vụ của người tiêu dùng đang chờ người tiêu dùng;

2.ConcurrentStack

ConcurrentStack là ngăn xếp vào trước ra trước (LIFO) an toàn theo luồng. Nó cho phép nhiều luồng thực hiện các thao tác đẩy và bật cùng một lúc.

Các tình huống áp dụng

  • thuật toán tìm kiếm theo chiều sâu: Được sử dụng khi thực hiện tìm kiếm theo chiều sâu trong biểu đồ hoặc cấu trúc cây
  • Hoàn tác thao tác: Khi thực hiện chức năng hoàn tác, đẩy bản ghi thao tác vào ngăn xếp và bật thao tác ra khỏi ngăn xếp khi hoàn tác.

lợi thế.

  • Kết quả đồng thời của hoạt động: Hỗ trợ nhiều luồng để thực hiện thao tác đẩy và bật cùng lúc
  • Thiết kế không khóa: Việc sử dụng các thuật toán nội bộ không khóa sẽ tránh được sự cạnh tranh về khóa và cải thiện hiệu suất.
  • Dễ dàng sử dụng: Cung cấp API đơn giản, ý tưởng nhưTryPop

Có.

  • .NET Framework 4.0 trở lên
  • .NET Core 1.0 trở lên

Mẫu mã.

sử dụng System.Collections.Concurrent; var stack = new ConcurrentStack(); var cts = new CancellationTokenSource(); var token = cts.Token; (int i = 0; i < 10; i++) { stack.Push(i); Console.WriteLine($"Đã đẩy {i}"); Thread.Sleep(100); // Mô phỏng độ trễ sản xuất} }, token); // Nhiệm vụ tiêu dùng var Consumer = Task.Run(() => { while (!token.IsCancellationRequested) { if (stack.TryPop(out int result)) { Console.WriteLine($"Popped {result}"); } Thread.Sleep(50); token); đang chờ Task.WhenAll(producer); cts.Cancel(); // Dừng tác vụ của người tiêu dùng đang chờ người tiêu dùng;

3.Tuỳ theo thời gian

ConcurrentBag là một bộ sưu tập không có thứ tự an toàn theo luồng phù hợp với các tình huống trong đó các phần tử thường xuyên được thêm và xóa.

Các tình huống áp dụng

  • nhóm nhiệm vụ: Thêm tác vụ vào bộ sưu tập và luồng công nhân nhận tác vụ từ bộ sưu tập và thực thi nó
  • bộ nhớ đệm: Lưu trữ dữ liệu tạm thời trong một bộ sưu tập và nhiều luồng có thể thêm và xóa dữ liệu đồng thời

lợi thế.

  • Kết quả đồng thời của hoạt động:Hỗ trợ nhiều thread để thực hiện thao tác thêm, xóa cùng lúc
  • Thiết kế không khóa: Việc sử dụng các thuật toán nội bộ không khóa sẽ tránh được sự cạnh tranh về khóa và cải thiện hiệu suất.
  • Thích hợp cho dữ liệu không có thứ tự: Rất phù hợp với các tình huống trong đó thứ tự các phần tử không quan trọng

Có.

  • .NET Framework 4.0 trở lên
  • .NET Core 1.0 trở lên

Mẫu mã.

sử dụng System.Collections.Concurrent; var bag = new ConcurrentBag(); var cts = new CancellationTokenSource(); var token = cts.Token; // Nhiệm vụ của nhà sản xuất var production = Task.Run(() => { for (int i = 0; i < 10; i++) { bag.Add(i); Console.WriteLine($"Đã thêm {i}"); Thread.Sleep(100); // Mô phỏng độ trễ sản xuất} }, token); // Nhiệm vụ tiêu dùng var Consumer = Task.Run(() => { while (!token.IsCancellationRequested) { if (bag.TryTake(out int result)) { Console.WriteLine($"Đã lấy {result}"); } Thread.Sleep(50); token); đang chờ Task.WhenAll(producer); cts.Cancel(); // Dừng tác vụ của người tiêu dùng đang chờ người tiêu dùng;

4. Từ điển đồng thời

ConcurrentDictionary là tập hợp các cặp khóa-giá trị an toàn theo luồng, tương tự như từ điển.

Các tình huống áp dụng

  • bộ nhớ đệm: Lưu trữ dữ liệu cặp khóa-giá trị, nhiều luồng có thể đọc và ghi đồng thời vào bộ đệm
  • quầy tính tiền: Lưu trữ dữ liệu bộ đếm, nhiều luồng có thể cập nhật đồng thời các giá trị bộ đếm

lợi thế.

  • Kết quả đồng thời của hoạt động: Hỗ trợ nhiều luồng cho các thao tác đọc và ghi đồng thời
  • Hoạt động nguyên tử: Hỗ trợ các hoạt động nguyên tử, chẳng hạn nhưThêm hoặc cập nhậtNhận hoặc Thêm, đảm bảo tính nhất quán của dữ liệu
  • tính linh hoạt: Cung cấp API phong phú và hỗ trợ nhiều thao tác

Có.

  • .NET Framework 4.0 trở lên
  • .NET Core 1.0 trở lên

Mẫu mã.

sử dụng System.Collections.Concurrent; vardictionary = new ConcurrentDictionary(); // Thêm phần tử var addTask = Task.Run(() => { for (int i = 0; i < 10; i++) { từ điển.TryAdd(i, $"value{i}"); Console.WriteLine($"Đã thêm khóa {i} với giá trị giá trị{i}"); Cập nhật phần tử var updateTask = Task.Run(() => { for (int i = 0; i < 10; i++) { var ii = i;diction.AddOrUpdate(i, $"new_value{i}", (key, oldValue) => $"new_value{ii}"); Console.WriteLine($"Đã cập nhật khóa {i} với giá trị new_value{i}"); Đọc các phần tử var readTask = Task.Run(() => { foreach (var key indiction.Keys) { if (dictionary.TryGetValue(key, out string? value)) { Console.WriteLine($"Key {key} has giá trị {value}"); } } }); đang chờ Task.WhenAll(addTask, updateTask, readTask);

5.Bộ chặn tập tin

BlockingCollection cung cấp các hoạt động bổ sung và loại bỏ an toàn theo luồng, đồng thời hỗ trợ các khả năng chặn và giới hạn. Có thể được sử dụng với ConcurrentQueue, ConcurrentStack, ConcurrentBag, v.v.

Các tình huống áp dụng

  • model sản phẩm được sử dụng: Nhiều luồng sản xuất thêm các mục dữ liệu vào bộ sưu tập và nhiều luồng tiêu dùng xóa các mục dữ liệu khỏi bộ sưu tập để xử lý.
  • Nhiệm vụ kế hoạch: Thêm tác vụ vào bộ sưu tập và luồng công nhân nhận tác vụ từ bộ sưu tập và thực thi nó

lợi thế.

  • chặn hoạt động: Hỗ trợ chặn các thao tác thêm và xóa, phù hợp với mô hình nhà sản xuất-người tiêu dùng
  • hàm giới hạn: Hỗ trợ thiết lập dung lượng tối đa của bộ sưu tập để tránh bị đầy quá mức
  • tính linh hoạt: Có thể được sử dụng với nhiều loại bộ sưu tập, chẳng hạn nhưHàng đợi đồng thời

Có.

  • .NET Framework 4.0 trở lên
  • .NET Core 1.0 trở lên

Mẫu mã.

sử dụng System.Collections.Concurrent; var Collection = new BlockingCollection(boundedCapacity: 5); var cts = new CancellationTokenSource(); var token = cts.Token; // Nhiệm vụ của nhà sản xuất var production = Task.Run(() = > { for (int i = 0; i < 10; i++) { Collection.Add(i); Console.WriteLine($"Đã thêm {i}"); Thread.Sleep(100); // Mô phỏng độ trễ sản xuất} Collection.CompleteAdding(); }, token); // Nhiệm vụ tiêu dùng var Consumer = Task.Run(() => { foreach (var item trong bộ sưu tập.GetConsumingEnumerable(token)) { Console.WriteLine($"Consumed {item}"); }, mã thông báo); đang chờ Task.WhenAll(nhà sản xuất, người tiêu dùng);

6. Danh sách bất kỳ

ImmutableList an toàn theo luồng vì tất cả các thao tác sửa đổi đều trả về một phiên bản bộ sưu tập mới.

Các tình huống áp dụng

  • Dữ liệu cấu hình: Lưu trữ dữ liệu cấu hình Nhiều luồng có thể đọc dữ liệu cấu hình đồng thời mà không lo dữ liệu bị sửa đổi.
  • Ảnh chụp nhanh: Có được ảnh chụp nhanh của dữ liệu tại một thời điểm nhất định. Nhiều luồng có thể đọc dữ liệu chụp nhanh đồng thời.

lợi thế.

  • Tự nhiên chủ đề an toàn: Vì các bộ sưu tập là bất biến nên nhiều luồng có thể đọc đồng thời một cách an toàn
  • tính toán tối đa của dữ liệu) data.
  • Dễ dàng sử dụng: Cung cấp API phong phú và hỗ trợ nhiều thao tác

Có.

  • .NET Framework 4.5 trở lên ( yêu cầu cài đặt System.Collections.Immutable gói NuGet)
  • .NET Core 1.0 trở lên ( yêu cầu cài đặt System.Collections.Immutable gói NuGet)

Mẫu mã.

var list = ImmutableList.Create(1, 2, 3); var newList = list.Add(4); Console.WriteLine(string.Join(", ", newList));

7. Bộ sưu tập được đồng bộ hóa

SynchronizedCollection là một bộ sưu tập toàn bộ theo luồng phù hợp với các vấn đề yêu cầu quyền truy cập được đồng bộ hóa.

Các tình huống áp dụng

  • Quản lý tài nguyên được chia sẻ: Quản lý bộ tài nguyên được chia sẻ. time.
  • đăng ký sự kiện: Lưu trữ sự kiện người đăng ký, nhiều luồng có thể bổ sung và xóa người đăng ký đồng thời

lợi thế.

  • Hợp nhất bộ tích hợp cơ chế: Tự động xử lý đồng bộ hóa để đảm bảo toàn luồng
  • Dễ dàng sử dụng: Cung cấp API đơn giản, ý tưởng nhưThêm vàoDi chuyển
  • tính linh hoạt: Hỗ trợ nhiều hoạt động thu thập

Có.

  • .NET Framework 3.5 trở lên
  • .NET Core 1.0 trở lên

Mẫu mã.

Bộ sưu tập var = Bộ sưu tập được đồng bộ hóa mới(); Collection.Add(1); Collection.Add(2); foreach (var item trong bộ sưu tập) { Console.WriteLine(item);

8. Đồng bộ hóaReadOnlyCollection

SynchronizedReadOnlyCollection là bộ sưu tập đọc toàn bộ theo luồng.

Các tình huống áp dụng

  • Dữ liệu cấu hình: Lưu trữ chỉ đọc cấu hình dữ liệu.
  • Chia sẻ dữ liệu: Lưu trữ dữ liệu chung, nhiều luồng có thể đọc đồng thời dữ liệu mà không có dữ liệu nào được chỉnh sửa.

lợi thế.

  • Hợp nhất bộ tích hợp cơ chế: Tự động xử lý đồng bộ hóa để đảm bảo toàn luồng
  • Dễ dàng sử dụng: Cung cấp API đơn giản, ý tưởng nhưChứaSao chép vào
  • Bảo vệ dữ liệu: Tính năng bảo đảm đọc dữ liệu sẽ không được sửa đổi

Có.

  • .NET Framework 3.0 trở lên
  • .NET Core 1.0 trở lên

Mẫu mã.

danh sách var = Danh sách mới { 1, 2, 3 }; var readOnlyCollection = new SynchronizedReadOnlyCollection(danh sách); foreach (var item trong readOnlyCollection) { Console.WriteLine(item);

9. Bộ sưu tập khóa được đồng bộ hóa

Bộ sưu tập khóa được đồng bộ hóa là bộ sưu tập có khóa toàn bộ theo luồng.

bản sử dụng.

  • bộ nhớ đệm: Lưu trữ dữ liệu có khóa, nhiều luồng có thể đọc và ghi đồng thời vào bộ đệm
  • Quản lý tài nguyên: Quản lý bộ sưu tập các tài nguyên có khóa.

lợi thế.

  • Hợp nhất bộ tích hợp cơ chế: Tự động xử lý đồng bộ hóa để đảm bảo toàn luồng
  • Truy cập khóa: Hỗ trợ truy cập nhanh vào các phần tử bằng phím tắt
  • tính linh hoạt: Hỗ trợ nhiều hoạt động thu thập

Có.

  • .NET Framework 3.0 trở lên
  • .NET Core 1.0 trở lên

Mẫu mã.

lớp công khai MyItem { public int Id { get; } Tên chuỗi công khai { get } } var Collection = new SynchronizedKeyedCollection(item => item.Id); = 1, Tên = "Item1" }); Collection.Add(new MyItem { Id = 2, Name = "Item2" }); WriteLine(item.Name); // Xuất Item1 và Item2 }

Cuối cùng, bài viết này về cấu trúc dữ liệu an toàn trong .NET end at here. tương lai!

59 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress