è comunque possibile utilizzare InterLocked
, ma poi si deve convertire il decimale in Int64
. Con la conversione devi decidere quanti posti decimali vuoi conservare per precisione. Così, per esempio, si desidera conservare posti 4 decimali, si potrebbe fare qualcosa di simile:
//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;
essere consapevoli del fatto che si perde di precisione, a seconda di quanti posti decimali che si desidera conservare. E Decimal.MaxValue
è 79,228,162,514,264,337,593,543,950,335
mentre Int64.MaxValue
è 9,223,372,036,854,775,807
. Quindi numeri molto grandi non andranno bene. Preservare 4 cifre decimali, il maggior numero prima della Int64 sarebbe traboccare è 9,223,372,036,854,775,807/10000 = 922,337,203,685,477
lo uso così come i numeri qui non potrà mai andare sopra miliardo e sono sicuro che l'utilizzo di Interlocked
in questo modo è più veloce in un ciclo Parallel.For poi utilizzando un lock
o un mutex.