- VisualStudio2022
- pprof-Hướng dẫn sử dụng nó trong bản mạng trực tiếp
- Triển khai C# các loại hộp chọn nhiều màu lựa chọn thả xuống, cây lựa chọn nhiều màu lựa chọn thả xuống và các nút tối đa
- [Ghi chú học tập] Cơ sở dữ liệu cấu trúc: cat tree
Blog trước đã chia sẻ cách sử dụng Kênh để phát triển lý do không đồng bộ luồng với số lượng lớn data. bằng ActionBlock.
Nó cung cấp một cách đơn giản và mạnh mẽ để xử lý các bài hát tác vụ và có thể dễ dàng phát triển mô hình nhà sản xuất-người tiêu dùng use.
Khối hành động
Có thể cấu hình để xử lý nhiều tác vụ bài hát, tăng hiệu quả xử lýKhối hành động
, user fromKhối hành động
Đọc dữ liệu và xử lý nóSử dụng ActionBlock rất đơn giản, các bước chính như sau:
Send no clock
Phương thức gửi dữ liệu tới ActionBlockComplete
Phương thức này thông báo cho ActionBlock rằng nó sẽ không nhận được dữ liệu mới nữa.Complete
Tất cả các tính năng chờ đợi quá trình xử lý hoàn tất dữ liệuKhối hành động:
use System.Threading.Tasks.Dataflow var actionBlock = new ActionBlock(async item => { // Mô phỏng quá trình xử lý không đồng bộ đang chờ Task.Delay(100); Console.WriteLine($"Processed item: {item}") ; }, ExecutionDataflowBlockOptions mới { MaxDegreeOfParallelism = 4 // Đặt tối đa bài hát ở mức độ }); Gửi dữ liệu tới ActionBlock for (int i = 0; i < 10; i++) { chờ actionBlock.SendAsync(i } // Hoàn thành ActionBlock actionBlock.Complete(); // Chờ quá trình xử lý hoàn tất đang chờ actionBlock.Completion; .WriteLine ("Tất cả các mục đã được xử lý.");
Giả sử chúng ta có một tập hợp dữ liệu cần được xử lý theo hai bước. Mỗi mục dữ liệu yêu cầu xử lý sơ bộ và sau đó xử lý thêm. Hy vọng rằng bước 2 có thể bắt đầu xử lý ngay khi bước 1 tạo ra dữ liệu kết quả, thay vì đợi bước 1 được xử lý hoàn toàn.
Sử dụng TransformBlock và ActionBlock để triển khai mô hình nhà sản xuất-người tiêu dùng. Nhà sản xuất chịu trách nhiệm đọc dữ liệu và gửi đến TransformBlock, còn người tiêu dùng đọc dữ liệu từ TransformBlock và xử lý dữ liệu đó. Sau đây là mã mẫu đơn giản minh họa cách sử dụng TransformBlock và ActionBlock để triển khai mẫu nhà sản xuất-người tiêu dùng để xử lý dữ liệu:
sử dụng System.Threading.Tasks.Dataflow; var cts = new CancellationTokenSource(); // Giả sử có một tập hợp dữ liệu var dataItems = Enumerable.Range(0, 1000).Select(x => $"data_{x}" ).ToList (); var bộ xử lý = new DataProcessor(10, cts.Token); đang chờ bộ xử lý.ProcessAsync(dataItems); Console.ReadKey(); /// /// Bộ xử lý dữ liệu /// lớp công khai DataProcessor(int maxDegreeOfParallelism, CancellationToken cancelToken) { public async Task ProcessAsync(List dataItems) { // Tạo TransformBlock để xử lý ở bước 1 và gửi kết quả đến ActionBlock ở bước 2 var step1Block = new TransformBlock(async dataItem => đang chờ Step1(dataItem), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = maxDegreeOfParallelism, CancellationToken = cancelToken }); // Tạo một ActionBlock để xử lý bước 2 var step2Block = new ActionBlock(async dataItem => { đang chờ Bước 2(dataItem); }, mới ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = maxDegreeOfParallelism, CancellationToken = cancelToken }); // Liên kết TransformBlock với ActionBlock step1Block.LinkTo(step2Block, new DataflowLinkOptions { PropagateCompletion = true }); // Bắt đầu nhiều nhiệm vụ ở bước 1 (nhà sản xuất) foreach (var dataItem in dataItems) { chờ đợi step1Block.SendAsync(dataItem, cancelToken); } // Hoàn thành việc ghi TransformBlock ở bước 1 step1Block.Complete(); // Đợi quá trình xử lý TransformBlock hoàn tất ở bước 1 đang chờ step1Block.Completion; của ActionBlock ở bước 2 step2Block.Complete(); // Đợi quá trình xử lý ActionBlock ở bước 2 hoàn tất đang chờ step2Block.Completion; } riêng tư async Task Step1(string dataItem) { // Mô phỏng quá trình xử lý ở bước 1 (chẳng hạn như xử lý dữ liệu sơ bộ) đang chờ Task.Delay(10, cancelToken Console.WriteLine($"Step1 đã xử lý mục dữ liệu: { dataItem} "); trả về dataItem; } không đồng bộ riêng tư Task Step2(string dataItem) { // Mô phỏng quá trình xử lý bước 2 (chẳng hạn như xử lý thêm dữ liệu) đang chờ Task.Delay(10, cancelToken); Console.WriteLine($"Mục dữ liệu đã xử lý ở bước 2: {dataItem}");
Giải thích mã
Quy trình không đồng bộ
Trong phương pháp này, trước tiên chúng ta tạo một TransformBlock để xử lý ở Bước 1. TransformBlock chấp nhận một mục dữ liệu đầu vào và trả về một mục dữ liệu đầu ra sau khi xử lý.TransformBlock
Chỉ ra rằng cả đầu vào và đầu ra đềusợi dây
kiểuKhối hành động
Cho biết đầu vào làsợi dây
kiểuLiên kết tới
phương thức kết nối hai khối và bộTuyên truyềnHoàn thành
Là đúng, biểu thị rằng khi TransformBlock hoàn thành thì ActionBlock cũng sẽ được hoàn thànhSend no clock
Phương thức gửi các mục dữ liệu tới TransformBlockComplete
Phương thức này thông báo cho TransformBlock rằng nó sẽ không còn nhận dữ liệu mới và sử dụngComplete
Thuộc tính chờ tất cả quá trình xử lý dữ liệu hoàn tất. Sau đó hoàn tất việc viết ActionBlock của Bước 2 và đợi quá trình xử lý ActionBlock của Bước 2 hoàn tất.Cuối cùng, bài viết này về cách sử dụng ActionBlock để đạt được khả năng xử lý dữ liệu nhiều bước hiệu quả trong .NETCore kết thúc tại đây. Nếu bạn muốn biết thêm về cách sử dụng ActionBlock để đạt được khả năng xử lý dữ liệu nhiều bước hiệu quả trong .NETCore, vui lòng Tìm kiếm các bài viết về CFSDN hoặc tiếp tục duyệt. các bài viết liên quan tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Giới thiệu về biểu thức chính quy Biểu thức chính quy còn được gọi là biểu thức chính quy và biểu thức quy ước. (Tiếng Anh: Regular Expression, thường viết tắt là regrec, regrec hoặc RE trong code), một khái niệm trong khoa học máy tính. biểu thức chính quy
Tôi là một lập trình viên xuất sắc, rất xuất sắc!