» » » » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

На нашем литературном портале можно бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю, Троелсен Эндрю . Жанр: Базы данных. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале litmir.org.
Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
Название: Язык программирования C#9 и платформа .NET5
Дата добавления: 22 август 2024
Количество просмотров: 242
Читать онлайн

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних просмотр данного контента СТРОГО ЗАПРЕЩЕН! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту readbookfedya@gmail.com для удаления материала

Язык программирования C#9 и платформа .NET5 читать книгу онлайн

Язык программирования C#9 и платформа .NET5 - читать бесплатно онлайн , автор Троелсен Эндрю

В 10-м издании книги описаны новейшие возможности языка C# 9 и .NET 5 вместе с подробным "закулисным" обсуждением, призванным расширить навыки критического мышления разработчиков, когда речь идет об их ремесле.

Книга охватывает ASP.NET Core, Entity Framework Core и многое другое наряду с последними обновлениями унифицированной платформы .NET, начиная с улучшений показателей производительности настольных приложений Windows в .NET 5 и обновления инструментария XAML и заканчивая расширенным рассмотрением файлов данных и способов обработки данных.

Все примеры кода были переписаны с учетом возможностей последнего выпуска C# 9.

Перейти на страницу:

using System;

using System.Threading;

namespace MultiThreadedPrinting

{

  public class Printer

  {

    public void PrintNumbers()

    {

      // Отобразить информацию о потоке.

      Console.WriteLine("-> {0} is executing PrintNumbers()",

        Thread.CurrentThread.Name);

      // Вывести числа.

      for (int i = 0; i < 10; i++)

      {

        // Приостановить поток на случайный период времени.

        Random r = new Random();

        Thread.Sleep(1000 * r.Next(5));

        Console.Write("{0}, ", i);

      }

      Console.WriteLine();

    }

  }

}

Вызывающий код отвечает за создание массива из десяти (уникально именованных) объектов Thread, каждый из которых вызывает метод одного и того же экземпляра класса Printer:

using System;

using System.Threading;

using MultiThreadedPrinting;

Console.WriteLine("*****Synchronizing Threads *****n");

Printer p = new Printer();

// Создать 10 потоков, которые указывают на один.

// и тот же метод того же самого объекта

Thread[] threads = new Thread[10];

for (int i = 0; i < 10; i++)

{

  threads[i] = new Thread(new ThreadStart(p.PrintNumbers))

  {

    Name = $"Worker thread #{i}"

  };

}

// Теперь запустить их все.

foreach (Thread t in threads)

{

  t.Start();

}

Console.ReadLine();

Прежде чем взглянуть на тестовые запуски, кратко повторим суть проблемы. Первичный поток внутри этого домена приложения начинает свое существование с порождения десяти вторичных рабочих потоков. Каждому рабочему потоку указывается на необходимость вызова метода PrintNumbers() того же самого экземпляра класса Printer. Поскольку никаких мер для блокировки разделяемых ресурсов данного объекта (консоли) не предпринималось, есть неплохой шанс, что текущий поток будет вытеснен до того, как метод PrintNumbers() выведет полные результаты. Из-за того, что не известно в точности, когда подобное может произойти (если вообще произойдет), будут получены непредсказуемые результаты. Например, вывод может выглядеть так:

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

*****Synchronizing Threads *****

-> Worker thread #3 is executing PrintNumbers()

-> Worker thread #0 is executing PrintNumbers()

-> Worker thread #1 is executing PrintNumbers()

-> Worker thread #2 is executing PrintNumbers()

-> Worker thread #4 is executing PrintNumbers()

-> Worker thread #5 is executing PrintNumbers()

-> Worker thread #6 is executing PrintNumbers()

-> Worker thread #7 is executing PrintNumbers()

-> Worker thread #8 is executing PrintNumbers()

-> Worker thread #9 is executing PrintNumbers()

0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 2, 3, 1, 2, 2, 2, 1, 2,

1, 1, 2, 2, 3, 3, 4,

3, 3, 2, 2, 3, 4, 3, 4, 5, 4, 5, 4, 4, 3, 6, 7, 2, 3, 4, 4, 4, 5, 6, 5,

3, 5, 8, 9,

6, 7, 4, 5, 6, 6, 5, 5, 5, 8, 5, 6, 7, 8, 7, 7, 6, 6, 6, 8, 9,

8, 7, 7, 7, 7, 9,

6, 8, 9,

8, 9,

9, 9,

8, 8, 7, 8, 9,

9,

9,

Запустите приложение еще несколько раз. Скорее всего, каждый раз вы будете получать отличающийся вывод.

На заметку! Если получить непредсказуемый вывод не удается, увеличьте количество потоков с 10 до 100 (например) или добавьте в код еще один вызов Thread.Sleep(). В конце концов, вы столкнетесь с проблемой параллелизма.

Должно быть совершенно ясно, что здесь присутствуют проблемы. В то время как каждый поток сообщает экземпляру Printer о необходимости вывода числовых данных, планировщик потоков благополучно переключает потоки в фоновом режиме. В итоге получается несогласованный вывод. Нужен способ программной реализации синхронизированного доступа к разделяемым ресурсам. Как и можно было предположить, пространство имен System.Threading предлагает несколько типов, связанных с синхронизацией. В языке C# также предусмотрено ключевое слово для синхронизации разделяемых данных в многопоточных приложениях.

Синхронизация с использованием ключевого слова lock языка C#

Первый прием, который можно применять для синхронизации доступа к разделяемым ресурсам, предполагает использование ключевого слова lock языка С#. Оно позволяет определять блок операторов, которые должны быть синхронизованными между потоками. В результате входящие потоки не могут прерывать текущий поток, мешая ему завершить свою работу. Ключевое слово lock требует указания маркера (объектной ссылки), который должен быть получен потоком для входа в область действия блокировки. Чтобы попытаться заблокировать закрытый метод уровня экземпляра, необходимо просто передать ссылку на текущий тип:

Перейти на страницу:
Комментариев (0)