LoveRead.info » Книги » Разная литература » Интернет-журнал "Домашняя лаборатория", 2007 №6 - Вязовский

Интернет-журнал "Домашняя лаборатория", 2007 №6 - Вязовский

Книгу Интернет-журнал "Домашняя лаборатория", 2007 №6 - Вязовский читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

138 0 18:00, 07-12-2022
Интернет-журнал "Домашняя лаборатория", 2007 №6 - Вязовский
07 декабрь 2022

Книга Интернет-журнал "Домашняя лаборатория", 2007 №6 - Вязовский читать онлайн бесплатно без регистрации

Большой и увлекательный, научно-прикладной и образовательный, но некоммерческий интернет-журнал, созданный группой энтузиастов. Интернет-журнал содержит материалы, найденные в Интернет или написанные для Интернет. Основная тематика статей — то, что можно сделать самому, от садовых поделок до сверхпроводников, но есть и просто полезные материалы.

    1 ... 245 246 247 248 249 250 251 252 253 ... 361
    Перейти на страницу:
    class="p1">        try {

                 у = checked((int) (x*2));

            }

            catch (Exception) {

                 return false;

             }

             return true;

         }

    }

    Public class Client {

           private static int workCount = 0;

           private delegate bool HardFunction2Args (

                int x, int y, out int result);

           private delegate bool HardFunctionlArg (

                int x, out int result);

           private static void SumCallback(IAsyncResult ar) {

                 int z;

                 HardFunction2Args sum =

                    (HardFunction2Args)ar.AsyncState;

                 bool result = sum.Endlnvoke(out z, ar);

                 if (result) Console.WriteLine (

                      "SumCallback: Sum = " + z);

                 else Console.WriteLine (

                      "SumCallback: Bad arguments for Server.Sum

                 workCount++;

            }

            private static void MultCallback(IAsyncResult ar) {

                 int z;

                 HardFunctionlArg mult =

                       (HardFunctionlArg)ar.AsyncState;

                 bool result = mult.Endlnvoke(out z, ar);

                 if (result) Console.WriteLine (

                      "MultCallback: MultBy2 = " + z);

                 else Console.WriteLine (

                      "MultCallback: Bad argument for MultBy2");

                  workCount++;

            }

            public static void Main() {

                 int sumResult, multResult, count = 0;

                 Console.WriteLine("Client thread = " +

                        Thread.CurrentThread.GetHashCode() + PoolThread = "+

                        Thread.CurrentThread.IsThreadPoolThread);

                  HardFunction2Args sum =

                         new HardFunction2Args(Server.Sum);

                  HardFunctionlArg mult =

                         new HardFunctionlArg(Server.MultBy2);

                  AsyncCallback sumCallback =

                         new AsyncCallback(SumCallback);

                  AsyncCallback multCallback =

                         new AsyncCallback(MultCallback);

                  IAsyncResult arSum = sum.Beginlnvoke(3, 4,

                         out sumResult, sumCallback, sum);

                   IAsyncResult arMult = mult.Beginlnvoke(5,

                          out multResult, multCallback, mult);

                   while (workCount < 2) {

                           Console.WriteLine("Client thread: count = "+ count++);

                           Thread.Sleep(100);

                  }

                  Console.WriteLine("Bye!");

            }

    }

    Комментарии к коду.

    Сервер и клиент представлены соответственно классами Server и Client.

    Сервер

    Сервер реализует два статических метода:

    • Метод public static bool Sum(int x, int у, out int z) {… } обеспечивает сложение двух чисел типа int. Результат записывается в переменную z типа int. В случае возникновения переполнения возвращается false, при его отсутствии — true.

    Временная сложность проводимых вычислений имитируется с помощью вызова Thread.Sleер(1000).

    В самом начале, еще до проведения вычислений, на консоль выводится хеш потока, выполняющего вызов (Thread.CurrentThread.GetHashCode()), и информация о принадлежности данного потока классу рабочих потоков из пула потоков (Thread.CurrentThread.IsThreadPoolThread)).

    • Метод public static bool MuitBy2(int x, out int y) {… } обеспечивает умножение числа на 2 и реализован аналогично предыдущему методу.

    Здесь важно отметить, что разработчик сервера не заботится о том, как именно будут вызываться методы сервера клиентами — синхронно или асинхронно. Все зависит от клиента. Он может вызывать методы сервера как синхронно, так и асинхронно.

    Клиент. Типы используемых делегатов

    В данном примере клиент вызывает методы сервера асинхронно, что достигается за счет использования делегатов.

    В коде клиента используются делегаты трех типов:

    • HardFunction2Args

    Этот тип определяется в классе client:

    private delegate bool HardFunction2Args (int x, int y, out int result);

    Данный делегат может делегировать вызов (как синхронный так и асинхронный) любому методу (как статическому так и нестатическому) любого класса с заданной сигнатурой (два входных параметра типа int, один выходной типа int, возвращаемое значение типа bool). В нашем случае вызов будет делегироваться методу Server::Sum.

    • HardFunctionlArg

    Этот тип также определяется в классе Client:

    private delegate bool HardFunctionlArg (int x, out int result);

    Данный делегат может делегировать вызов (как синхронный так и асинхронный) любому методу (как статическому так и нестатическому) любого класса с заданной сигнатурой (один входной параметр типа int, один выходной типа int, возвращаемое значение типа bool). В данном случае вызов будет делегироваться методу Server::MultBy2.

     AsyncCallback

    Этот тип определен в System. Он может использоваться для делегирования вызова методу со следующей сигнатурой:

    ♦ один входной параметр типа IAsyncResult (тип определен в System);

    ♦ возвращаемое значение отсутствует (void).

    В нашем случае делегаты данного типа будут использоваться для делегирования вызовов методам клиента Client::SumCallback и Client::MultCallback.

    Метод

    private static void SumCallback (IAsyncResult ar) {… }

    клиента вызывается инфраструктурой асинхронных вызовов для уведомления клиента о том, что сделанный им ранее асинхронный вызов метода sum сервера завершен.

    Аналогично, метод

    private static void MultCallback (IAsyncResult ar) {… }

    клиента вызывается инфраструктурой асинхронных вызовов для уведомления клиента о том, что сделанный им ранее асинхронный вызов метода MuitBy2 сервера завершен также.

    Клиент. Инициирование асинхронных вызовов

    Прежде чем обсуждать завершение асинхронных вызовов уместно рассмотреть их инициирование. Для этого обратимся к коду метода Client::Main.

    Прежде всего клиент выводит на консоль хеш основного потока

    (Thread. CurrentThread. GetHashCode()) и информацию о принадлежности данного потока классу рабочих потоков из пула потоков

    (Thread.CurrentThread.IsThreadPoolThread)).

    Далее создаются два делегата для инициирования асинхронных вызовов методов сервера. Делегат sum

    HardFunction2Args sum = new HardFunction2Args(Server.Sum);

    используется для асинхронного вызова метода Server::Sum, а делегат mult

    HardFunctionlArg mult = new HardFunctionlArg(Server.MultBy2);

    используется для асинхронного вызова метода Server::MultBy2.

    Далее формируются делегаты sumCallback и multCallback

    AsyncCallback sumCallback = new AsyncCallback(SumCallback);

    AsyncCallback multCallback = new AsyncCallback(MultCallback);

    которые будут использоваться инфраструктурой асинхронных вызовов для уведомления клиента о завершении соответственно Server::Sum и Server::MultBy2 вызовов.

    Инициирование асинхронных вызовов производится клиентом следующим образом:

    IAsyncResult arSum = sum.Beginlnvoke(3, 4, out sumResult, sumCallback, sum);

    IAsyncResult arMult = mult.Beginlnvoke(5, out multResult, multCallback, mult);

    Немного о делегатах в связи с асинхронными вызовами

    Остановимся на некоторых вопросах, связанных с делегатами, имеющими отношение к асинхронным вызовам.

    Делегаты sum и mult являются экземплярами ненаследуемых классов, производных от класса System.MuiticastDelegate. Система автоматически формирует эти классы, и, в том числе, реализации их методов Invoke, Begininvoke и EndInvoke. Рассмотрим, для примера, сигнатуры этих методов для делегата sum:

     public bool Invoke(int, int, out int)

    Данный метод может использоваться для синхронного вызова метода Server::Sum. Первые два аргумента используются

    1 ... 245 246 247 248 249 250 251 252 253 ... 361
    Перейти на страницу:
    1. Жалоба
    Отзывы - 0

    Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


    Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

    • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
    • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
    • 3. Просьба отказаться от нецензурной лексики.
    • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

    Надеемся на Ваше понимание и благоразумие. С уважением, администратор LoveRead.info.


    Установить VPN и читай слушай бесплатно

    Новые отзывы

    1. Валентина Валентина04 июль 13:25 Большое спасибо за интересную тему.  Сюжет заманчиввй,интересный. Жду продолжения ... Лекарь Фамильяров. Том 7 - Александр Лиманский
    2. Наталья По Наталья По01 июль 10:12 Ужасный перевод:(... Аркадия - Эрин Дум
    3. Вика Вика29 июнь 21:56 Какая хрень с первых строк.  У ребенка в 14 месяце не может быть черепно мозговой травмы при падании с дивана ... Вернуть семью любой ценой - Чарли Ви
    Все комметарии
    Новинки бесплатной онлайн библиотеки