Bạn vẫn có thể sử dụng InterLocked
, nhưng sau đó bạn phải chuyển đổi số thập phân thành số Int64
. Với quá trình chuyển đổi, bạn phải quyết định số lượng vị trí thập phân bạn muốn giữ cho độ chính xác. Ví dụ: bạn muốn giữ 4 chữ số thập phân, bạn có thể làm như sau:
//Declare up front accessible from all threads
Int64 totalAmount = 0;
//Inside the thread you do this
var amount = (Int64)(decimalAmount * 10000); //10.000 is to preserve 4 decimal places
Interlocked.Add(ref totalAmount, amount);
//After all threads have finished, go back to decimal type.
var totalDecimalAmount = totalAmount/10000;
Lưu ý rằng bạn sẽ mất chính xác, tùy thuộc vào số lượng chữ số thập phân bạn muốn giữ. Và Decimal.MaxValue
là 79,228,162,514,264,337,593,543,950,335
trong khi Int64.MaxValue
là 9,223,372,036,854,775,807
. Vì vậy, số lượng rất lớn sẽ không phù hợp. Bảo quản 4 chữ số thập phân, số lớn nhất trước khi tràn Int64 sẽ là 9,223,372,036,854,775,807/10000 = 922,337,203,685,477
Tôi sử dụng số này theo số ở đây sẽ không bao giờ vượt quá 1.000.000.000 và tôi chắc chắn rằng sử dụng Interlocked
theo cách này sẽ nhanh hơn trong vòng lặp Parallel.For sử dụng lock
hoặc mutex.