Простой ответ заключается в том, что приведенный выше код может вызывать проблемы при одновременном доступе из нескольких потоков.
.NET Framework предоставляет два решения: блокировка и синхронизация потоков.
Для простых манипуляций с типом данных (например, целых) блокировка с использованием Interlocked class будет работать правильно и является рекомендуемым подходом.
На самом деле, блокировка предоставляет специальные методы (Увеличение и Уменьшение), которые облегчают этот процесс:
Добавьте метод IncrementCount в свой класс CrossRoads:
public void IncrementCount() {
Interlocked.Increment(ref _timeouts);
}
Тогда позвоните своему фоновому работнику:
public void TimeIsUp(CrossRoads crossRoads){
crossRoads.IncrementCount();
}
Чтение значения, кроме 64-разрядного значения в 32-разрядной ОС, является атомарным. Подробнее см. Документацию по методу Interlocked.Read .
Для объектов класса или более сложных операций вам потребуется использовать поток блокировку синхронизации (блокировка в C # или SyncLock в VB.Net).
Это достигается путем создания статического объекта синхронизации на уровне, к которому должна применяться блокировка (например, внутри вашего класса), получения блокировки для этого объекта и выполнения (только) необходимых операций внутри этой блокировки:
private static object SynchronizationObject = new Object();
public void PerformSomeCriticalWork()
{
lock (SynchronizationObject)
{
// do some critical work
}
}