- [C#] Hướng dẫn giải nén file *.rar với tiến trình progress bar winform
- [C#] Chia sẻ source code make Crazy Error Message Effect Bomb Windows
- [C#] Lập trình ứng dụng theo mô hình MVP Model-View-Presenter Pattern Winform
- [C#] Giới thiệu và những thứ hay ho từ thư viện System.Reactive của Microsoft
- [C#] Hướng dẫn tạo ứng dụng Chat với GPT sử dụng Open AI API
- [DEVEXPRESS] Tạo month picker trên DateEdit Winform C#
- [DATABASE] Cách sử dụng và lưu ý khi sử dụng khóa ngoại (Foreign Key) trong Sqlserver
- [C#] Garbage Collector (GC) là gì? Cách giải phóng bộ nhớ trên ứng dụng Winform khi các đối tượng không còn sử dụng
- [C#] Cách tính độ tương phản màu sắc Contrast Color mà con người có thể nhìn thấy được
- [C#] Hướng dẫn mã hóa mật khẩu tài khoản ứng dụng đúng chuẩn Men
- [C#] Sử dụng Open AI Chat GPT viết ứng dụng Count down timer có hiệu ứng trên winform
- [DATABASE] Chia sẻ dữ liệu Pantone Color sql và json api
- [SQLSERVER] Tạo mã sản phẩm tự động như: SP0001, SP0002, SP0003... sử dụng Trigger
- [C#] Hướng dẫn kiểm tra phiên bản NET Framework cài đặt ở máy tính
- [C#] Hướng dẫn đọc file excel đơn giản sử dụng thư viện Epplus
- [C#] ConcurrentBag là gì và cách sử dụng nó trong lập trình bất đồng bộ
- [C#] AutoResetEvent là gì và cách sử dụng
- [DEVEXPRESS] Chia sẻ source code cách tạo biểu đồ sơ đồ tổ chức công ty Org Chart trên Winform C#
- [C#] Hướng dẫn tạo Auto Number trên Datagridview winform
- [DATABASE] Hướng dẫn tạo Procedure String Split in Mysql
[C#] ConcurrentBag là gì và cách sử dụng nó trong lập trình bất đồng bộ
Xin chào các bạn, bài viết hôm nay mình sẻ tiếp tục giới thiệu về ConcurrentBag là gì và cách sử dụng nó trong lập trình bất đồng bộ C#.
ConcurrentBag là gì?
ConcurrentBag
là một kiểu dữ liệu trong C#, được sử dụng để lưu trữ một tập hợp các phần tử với truy cập đồng thời (concurrent) từ nhiều luồng cùng một lúc.
Nó cung cấp các phương thức để thêm, lấy và kiểm tra phần tử tồn tại trong tập hợp, với việc đảm bảo tính đồng bộ (thread-safe) trong quá trình thực hiện.
1. Cách tạo một ConcurrentBag collection
ConcurrentBag<int> bag = new ConcurrentBag<int>();
Đoạn code ở trên là cách khai báo 1 ConcurrentBag.
Hoặc bạn có thể thêm nó từ một danh sách List<int> đang có sẵn như đoạn code dưới:
List<int> ints = new List<int>();
ints.Add(1);
ints.Add(2);
ints.Add(3);
ints.Add(4);
ConcurrentBag<int> bag = new ConcurrentBag<int>(ints);
int count = bag.Count;
2. Cách thêm một item vào ConcurrentBag sử dụng phương thức Add()
ConcurrentBag<int> bag = new ConcurrentBag<int>();
bag.Add(1);
bag.Add(2);
Hoặc thêm nhiều item một lúc từ danh sách một mảng array.
int[] arr = { 1, 2, 3 };
ConcurrentBag<int> bag = new ConcurrentBag<int>();
foreach(var item in arr)
{
bag.Add(item);
}
Cách đếm tất cả item, chúng ta sử dụng hàm count
ConcurrentBag<int> bag = new ConcurrentBag<int>();
bag.Add(1);
bag.Add(2);
int count = bag.Count; //returns 2
3. Cách duyệt các item trong ConcurrentBag
Chúng ta sử dụng hàm TryPeek()
và TryTake()
+ TryPeek() chúng ta sẽ duyệt qua các item nhưng không xóa chúng ra khỏi danh sách ConcurrentBag
ConcurrentBag<int> bag = new ConcurrentBag<int>();
bag.Add(1);
bag.Add(2);
int item;
bool isSucess = bag.TryPeek(out item); //isSuccess=True, item = 2
isSuccess = bag.TryPeek(out item); //isSuccess=True, item = 2
isSuccess = bag.TryPeek(out item); //isSuccess=True, item = 2
+ TryTake() lấy ra từng item và xóa chúng ra khỏi danh sách ConcurrentBag
ConcurrentBag<int> bag = new ConcurrentBag<int>();
bag.Add(1);
bag.Add(2);
int item;
bool isSuccess = bag.TryTake(out item); //isSuccess=True, item = 2
isSuccess = bag.TryTake(out item); //isSuccess=True, item = 1
4. Ví dụ sử dụng ConcurrentBag sử dụng từ nhiều Thread.
Ví dụ: Chúng ta tạo 2 Thread bao gồm: Thread1 và Thread2.
+ Tại Thread1: chúng ta sẽ thêm vào 4 đối tượng: 1,2,3,4
+ Tại Thread2: chúng ta sẽ thêm vào 3 đối tượng: 5,6,7
Sau khi, Thread1 đã add data vào, chúng ta sẽ xuất dữ liệu từng đối tượng đó ra.
Ở ví dụ code dưới, các bạn sẽ thấy nó sẽ xuất ra màn hình: 1,2,3,4 và chờ đợi Thead2 thêm dữ liệu xong nó sẽ tiếp tục xuất ra tiếp: 5,6,7
static void Main(string[] args)
{
ConcurrentBag<int> bag = new ConcurrentBag<int>();
AutoResetEvent autoEvent1 = new AutoResetEvent(false);
Task t1 = Task.Factory.StartNew(() =>
{
for (int i = 1; i <= 4; ++i)
{
bag.Add(i);
}
//wait for second thread to add its items
autoEvent1.WaitOne();
while (bag.IsEmpty == false)
{
int item;
if (bag.TryTake(out item))
{
Console.WriteLine(item);
}
}
});
Task t2 = Task.Factory.StartNew(() =>
{
for (int i = 5; i <= 7; ++i)
{
bag.Add(i);
}
autoEvent1.Set();
});
t1.Wait();
//Output
// 4
// 3
// 2
// 1
// 5
// 6
// 7
}
Để dễ hiểu, các bạn hãy copy đoạn code trên vào chạy vào Visual Studio để dễ hình dung.
Thanks for watching!