¿Cuál es la forma de obtener un contador seguro para subprocesos en C # con el mejor rendimiento posible?
Esto es tan simple como se pone:
public static long GetNextValue()
{
long result;
lock (LOCK)
{
result = COUNTER++;
}
return result;
}
¿Pero hay alternativas más rápidas?
fuente
Le sugiero que use el incremento de enclavamiento integrado de .NET en la biblioteca System.Threading.
El siguiente código incrementará una variable larga por referencia y es completamente seguro para subprocesos:
Fuente: http://msdn.microsoft.com/en-us/library/dd78zt0c.aspx
fuente
Prueba con Interlocked.
fuente
Como ya se mencionó uso
Interlocked.Increment
Ejemplo de código de MS:
El siguiente ejemplo determina cuántos números aleatorios que van de 0 a 1,000 son necesarios para generar 1,000 números aleatorios con un valor de punto medio. Para realizar un seguimiento del número de valores de punto medio, una variable, midpointCount, se establece igual a 0 y se incrementa cada vez que el generador de números aleatorios devuelve un valor de punto medio hasta llegar a 10,000. Debido a que tres subprocesos generan los números aleatorios, se llama al método Incremento (Int32) para garantizar que varios subprocesos no actualicen midpointCount simultáneamente. Tenga en cuenta que también se usa un bloqueo para proteger el generador de números aleatorios, y que se usa un objeto CountdownEvent para garantizar que el método Main no termine la ejecución antes de los tres subprocesos.
El siguiente ejemplo es similar al anterior, excepto que usa la clase Task en lugar de un procedimiento de subproceso para generar 50,000 enteros de punto medio aleatorio. En este ejemplo, una expresión lambda reemplaza el procedimiento de hilo GenerateNumbers y la llamada al método Task.WaitAll elimina la necesidad del objeto CountdownEvent.
https://docs.microsoft.com/en-us/dotnet/api/system.threading.interlocked.increment?view=netcore-3.0
fuente