Qual é a maneira de obter um contador seguro de threads em C # com o melhor desempenho possível?
Isto é o mais simples possível:
public static long GetNextValue()
{
long result;
lock (LOCK)
{
result = COUNTER++;
}
return result;
}
Mas existem alternativas mais rápidas?
fonte
Sugiro que você use o incremento de intertravamento do .NET incorporado na biblioteca System.Threading.
O código a seguir incrementará uma variável longa por referência e é completamente seguro para threads:
Fonte: http://msdn.microsoft.com/en-us/library/dd78zt0c.aspx
fonte
Tente com Interlocked.Increment
fonte
Como já mencionado, use
Interlocked.Increment
Exemplo de código do MS:
O exemplo a seguir determina quantos números aleatórios que variam de 0 a 1.000 são necessários para gerar 1.000 números aleatórios com um valor de ponto médio. Para acompanhar o número de valores do ponto médio, uma variável, midpointCount, é configurada igual a 0 e incrementada toda vez que o gerador de números aleatórios retorna um valor do ponto médio até atingir 10.000. Como três threads geram números aleatórios, o método Increment (Int32) é chamado para garantir que vários threads não atualizem o midpointCount simultaneamente. Observe que um bloqueio também é usado para proteger o gerador de números aleatórios e que um objeto CountdownEvent é usado para garantir que o método Main não conclua a execução antes dos três threads.
O exemplo a seguir é semelhante ao anterior, exceto que ele usa a classe Task em vez de um procedimento de thread para gerar 50.000 números inteiros aleatórios de ponto médio. Neste exemplo, uma expressão lambda substitui o procedimento de thread GenerateNumbers e a chamada para o método Task.WaitAll elimina a necessidade do objeto CountdownEvent.
https://docs.microsoft.com/en-us/dotnet/api/system.threading.interlocked.increment?view=netcore-3.0
fonte