Язык программирования C#9 и платформа .NET5 - Джепикс Филипп - Страница 285
- Предыдущая
- 285/642
- Следующая
Изменить размер шрифта:
285
private void SomePrivateMethod(){ // Использовать текущий объект как маркер потока. lock(this) { // Весь код внутри этого блока является безопасным к потокам. }}Тем не менее, если блокируется область кода внутри открытого члена, то безопаснее (да и рекомендуется) объявить закрытую переменную-член типа
objectpublic class Printer{ // Маркер блокировки. private object threadLock = new object(); public void PrintNumbers() { // Использовать маркер блокировки. lock (threadLock) { ... } }}В любом случае, если взглянуть на метод
PrintNumbers()Consolelockpublic void PrintNumbers(){ // Использовать в качестве маркера блокировки закрытый член object. lock (threadLock) { // Вывести информацию о потоке. Console.WriteLine("-> {0} is executing PrintNumbers()", Thread.CurrentThread.Name); // Вывести числа. Console.Write("Your numbers: "); for (int i = 0; i < 10; i++) { Random r = new Random(); Thread.Sleep(1000 * r.Next(5)); Console.Write("{0}, ", i); } Console.WriteLine(); }}В итоге вы построили метод, который позволит текущему потоку завершить свою задачу. Как только поток входит в область
locklockААНа заметку! Если необходимо блокировать код в статическом методе, тогда следует просто объявить закрытую статическую переменную-член типа
objectЗапустив приложение, вы заметите, что каждый поток получил возможность выполнить свою работу до конца:
*****Synchronizing Threads *****-> Worker thread #0 is executing PrintNumbers()Your numbers: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-> Worker thread #1 is executing PrintNumbers()Your numbers: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-> Worker thread #3 is executing PrintNumbers()Your numbers: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-> Worker thread #2 is executing PrintNumbers()Your numbers: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-> Worker thread #4 is executing PrintNumbers()Your numbers: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-> Worker thread #5 is executing PrintNumbers()Your numbers: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-> Worker thread #7 is executing PrintNumbers()Your numbers: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-> Worker thread #6 is executing PrintNumbers()Your numbers: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-> Worker thread #8 is executing PrintNumbers()Your numbers: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-> Worker thread #9 is executing PrintNumbers()Your numbers: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,Синхронизация с использованием типа System.Threading.Monitor
Оператор
lockSystem.Threading.Monitorlockldasm.exepublic void PrintNumbers(){ Monitor.Enter(threadLock); try { // Вывести информацию о потоке. Console.WriteLine("-> {0} is executing PrintNumbers()", Thread.CurrentThread.Name);
285
- Предыдущая
- 285/642
- Следующая
Перейти на страницу:
