Tôi có một vòng lặp Parallel.ForEach chạy một hoạt động chuyên sâu bên trong cơ thể.Sử dụng hashtable bên trong Parallel.ForEach?
Thao tác có thể sử dụng giá trị Hashtable để lưu trữ các giá trị và có thể được sử dụng lại cho các mục vòng lặp liên tiếp khác. Tôi thêm vào Hashtable sau khi hoạt động chuyên sâu hoàn tất, mục vòng lặp tiếp theo có thể tra cứu trong Hashtable và tái sử dụng đối tượng, thay vì chạy lại thao tác chuyên sâu.
Tuy nhiên, vì tôi đang sử dụng Parallel.ForEach có vấn đề không an toàn, khiến các cuộc gọi Hashtable.Add và ContainsKey (khóa) không đồng bộ, vì chúng có thể chạy song song. Giới thiệu ổ khóa có thể gây ra vấn đề về sự hoàn hảo.
Dưới đây là đoạn code mẫu:
Hashtable myTable = new Hashtable;
Parallel.ForEach(items, (item, loopState) =>
{
// If exists in myTable use it, else add to hashtable
if(myTable.ContainsKey(item.Key))
{
myObj = myTable[item.Key];
}
else
{
myObj = SomeIntensiveOperation();
myTable.Add(item.Key, myObj); // Issue is here : breaks with exc during runtime
}
// Do something with myObj
// some code here
}
Phải có một số API, thiết lập tài sản bên trong thư viện TPL, mà có thể xử lý tình huống này. Lanhung?
@AdamRalph: kể từ khi ông đang sử dụng TPL thư viện ông đã sử dụng .net 4.0 –
@Adam & Yassir: đúng, các bộ sưu tập mới được thiết kế với ý tưởng LINQ song song. –
Yup Cảm ơn bạn đã trả lời và nhận xét – Vin