Во-первых, используйте одноэлементный режим в режиме разработки, чтобы предотвратить множественную инициализацию объектов, вызывающую несогласованность в пространстве доступа.
В точке подсчета следует добавить блокировку, чтобы временно заблокировать подсчет других потоков и обеспечить точность подсчета.
Если вы хотите считать и выводить результаты в реальном времени, вы можете заблокировать подсчет и вывод вместе. В противном случае результаты подсчета и вывода разных потоков могут обрабатываться не по порядку.
Блокировка таким способом может обеспечить последовательную обработку и последовательный вывод, но при этом несколько потеряется производительность.
Положение замка в коде очень важно
Эта программа добавит три операции. Причина в том, что этот поток не достиг 200 раз, но поток должен быть добавлен впервые, поэтому принимайте решение при добавлении.
Скопируйте код кода следующим образом:
CommonSigleton MyCounter =CommonSigleton.Instance;
/// <сводка>
/// Работа с потоком
/// </сводка>
публичная недействительность DoSomeWork()
{
///Создаем строку отображения
строковые результаты = "";
///Создаем экземпляр Sigleton
System.Threading.Thread.Sleep(100);
интервал я = 0;
в то время как (MyCounter.GetCounter() < 200)
{
// Убедитесь, что счетчик соответствует выходным данным. Даже если между счетчиком и выходными данными добавляется временной интервал, эта область будет заблокирована, чтобы предотвратить работу других потоков.
заблокировать (это)
{
///Начинаем считать
МойСчетчик.Добавить();
System.Threading.Thread.Sleep(100);
Поток потока = Thread.CurrentThread;
результаты += "поток";
результаты += i++.ToString() + "――〉" + thread.Name + " ";
результаты += "Текущий счетчик:";
результаты += MyCounter.GetCounter().ToString();
результаты += "/n";
Console.WriteLine(результаты);
// Очищаем отображаемую строку
результаты = "";
}
}
}
общественная недействительность StartMain()
{
Поток thread0 = Thread.CurrentThread;
thread0.Name = "Поток 0";
Поток thread1 = новый поток (новый ThreadStart (DoSomeWork));
thread1.Name = "Поток 1";
Поток thread2 = новый поток (новый ThreadStart (DoSomeWork));
thread2.Name = "Поток 2";
Поток thread3 = новый поток (новый ThreadStart (DoSomeWork));
thread3.Name = "Поток 3";
поток1.Начать();
поток2.Начать();
поток3.Начать();
///Поток 0 выполняет ту же работу, что и другие потоки
СделатьНечтоРабота();
}
}