Tôi muốn xử lý một bộ sưu tập song song, nhưng tôi gặp khó khăn khi thực hiện nó và do đó tôi hy vọng có được sự giúp đỡ.
Rắc rối phát sinh nếu tôi muốn gọi một phương thức được đánh dấu không đồng bộ trong C #, trong lambda của vòng lặp song song. Ví dụ:
var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, async item =>
{
// some pre stuff
var response = await GetData(item);
bag.Add(response);
// some post stuff
}
var count = bag.Count;
Vấn đề xảy ra với số đếm là 0, bởi vì tất cả các luồng được tạo ra thực sự chỉ là các luồng nền và Parallel.ForEach
cuộc gọi không chờ hoàn thành. Nếu tôi xóa từ khóa async, phương thức sẽ như sau:
var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, item =>
{
// some pre stuff
var responseTask = await GetData(item);
responseTask.Wait();
var response = responseTask.Result;
bag.Add(response);
// some post stuff
}
var count = bag.Count;
Nó hoạt động, nhưng nó hoàn toàn vô hiệu hóa sự thông minh đang chờ đợi và tôi phải thực hiện một số xử lý ngoại lệ thủ công .. (Đã xóa để cho ngắn gọn).
Làm cách nào tôi có thể thực hiện một Parallel.ForEach
vòng lặp, sử dụng từ khóa đang chờ trong lambda? Có thể không?
Nguyên mẫu của phương thức Parallel.ForEach có một Action<T>
tham số làm tham số, nhưng tôi muốn nó chờ lambda không đồng bộ của tôi.
await
khỏiawait GetData(item)
khối mã thứ hai vì nó sẽ tạo ra lỗi biên dịch.