KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Герберт Шилдт - C# 4.0: полное руководство

Герберт Шилдт - C# 4.0: полное руководство

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Герберт Шилдт, "C# 4.0: полное руководство" бесплатно, без регистрации.
Перейти на страницу:

Дробные доли секунды. Количество символов-заполнителей F обозначает точность представления, а остальные цифры отбрасываются и конечные нули не отображаются


В приведенной ниже программе демонстрируется форматирование объектов типа TimeSpan на примере отображения времени, которое приблизительно требуется для вывода на экран 1000 целых значений в цикле for.


// Отформатировать объект типа TimeSpan.

using System;

class TimeSpanDemo {

  static void Main() {

    DateTime start = DateTime.Now;


    // Вывести числа от 1 до 1000.

    for(int i = 1; i <= 1000; i++)    {

      Console.Write(i + " ");

      if((i % 10) == 0) Console.WriteLine();

    }


    Console.WriteLine();

    DateTime end = DateTime.Now;

    TimeSpan span = end - start;


    Console.WriteLine("Время выполнения: {0:c}", span);

    Console.WriteLine("Время выполнения: {0:g}", span);

    Console.WriteLine("Время выполнения: {0:G}", span);

    Console.WriteLine("Время выполнения: 0.{0:fff} секунды", span);

  }

}


Выполнение этой программы приводит к следующему результату, который и в этом случае зависит от конкретных настроек языковых и региональных параметров локализации базового программного обеспечения, а также от загрузки системы задачами и ее быстродействия.


. . .

981 982 983 984 985 986 987 988 989 990

991 992 993 994 995 996 997 998 999 1000

Время выполнения: 00:00:00.0140000

Время выполнения: 0:00:00.014

Время выполнения: 0:00:00:00.0140000

Время выполнения: 0.014 секунды


Форматирование перечислений

В C# допускается также форматировать значения, определяемые в перечислении. Вообще говоря, значения из перечисления могут отображаться как по имени, так и по значению. Спецификаторы формата перечислений сведены в табл. ”22.10. Обратите особое внимание на форматы G и F. Перед перечислениями, которые должны представлять битовые поля, следует указывать атрибут Flags. Как правило, в битовых полях хранятся значения, обозначающие отдельные двоичные разряды и упорядоченные по степени числа 2. При наличии атрибута Flags имена всех битовых составляющих форматируемого значения, если, конечно, это действительное значение, отображаются с помощью спецификатора G. А с помощью спецификатора F отображаются имена всех битовых составляющих форматируемого значения, если оно составляется путем логического сложения по ИЛИ двух или более полей, определяемых в перечислении.


Таблица 22.10. Спецификаторы формата перечислений

Спецификатор

Назначение


D

Отображает    значение    в виде десятичного целого числа


d

То же, что и D


F

Отображает имя значения. Если это значение можно создать путем логического сложения по ИДИ двух или более полей, определенных в перечислении, то данный спецификатор отображает имена всех битовых составляющих заданного значения, причем независимо оттого, задан атрибут Flags или нет


f

То же, что и F


G

Отображает имя значения.    Если перед форматируемым перечислением    указывается атрибут Flags, то данный спецификатор отображает имена всех битовых составляющих заданного значения, если, конечно, это допустимое значение


g

То же, что и G


X

Отображает значение в виде шестнадцатеричного целого числа. Для отображения как минимум восьми цифр форматируемое значение дополняется (при необходимости) начальными нулями


х

То же, что и X


В приведенной ниже программе демонстрируется применение спецификаторов формата перечислений.


// Отформатировать перечисление.

using System;

class EnumFmtDemo {

  enum Direction { North, South, East, West }

  [Flags]

  enum Status {

    Ready = 0x1, OffLine = 0x2,

    Waiting = 0x4, TransmitOK = 0x8,

    ReceiveOK = 0x10, OnLine = 0x20

  }


  static void Main() {

    Direction d = Direction.West;

    Console.WriteLine("{0:G}", d);

    Console.WriteLine("{0:F}", d);

    Console.WriteLine("{0:D}", d);

    Console.WriteLine("{0:X}", d);


    Status s = Status.Ready | Status.TransmitOK;


    Console.WriteLine("{0:G}", s);

    Console.WriteLine("{0:F}", s);

    Console.WriteLine("{0:D}", s);

    Console.WriteLine("{0:X}", s);

  }

}


Ниже приведен результат выполнения этой программы.


West

West

3

00000003

Ready, TransmitOK

Ready, TransmitOK

9

00000009


ГЛАВА 23 Многопоточное программирование. Часть первая: основы

 Среди многих замечательных свойств языка C# особое место принадлежит поддержке многопоточного программирования. Многопоточная программа состоит из двух или более частей, выполняемых параллельно. Каждая часть такой программы называется потоком и определяет отдельный путь выполнения команд. Таким образом, многопоточная обработка является особой формой многозадачности.

Многопоточное программирование опирается на целый ряд средств, предусмотренных для этой цели в самом языке С#, а также на классы, определенные в среде .NET Framework. Благодаря встроенной в C# поддержке многопоточной обработки сводятся к минимуму или вообще устраняются многие трудности, связанные с организацией многопоточной обработки в других языках программирования. Как станет ясно из дальнейшего, поддержка в C# многопоточной обработки четко организована и проста для понимания.

С выпуском версии 4.0 в среде .NET Framework появились два важных дополнения, имеющих отношение к многопоточным приложениям. Первым из них является TPL (Task Parallel Library — Библиотека распараллеливания задач), а вторым — PLINQ (Parallel LINQ — Параллельный язык интегрированных запросов). Оба дополнения поддерживают параллельное программирование и позволяют использовать преимущества, предоставляемые многопроцессорными (многоядерными) компьютерами в отношении обработки данных. Кроме того, библиотека TPL упрощает создание многопоточных приложений и управление ими. В силу этого многопоточная обработка, опирающаяся на TPL, рекомендуется теперь как основной подход к разработке многопоточных приложений. Тем не менее накопленный опыт создания исходной многопоточной подсистемы по-прежнему имеет значение по целому ряду причин. Во-первых, уже существует немалый объем унаследованного кода, в котором применяется первоначальный подход к многопоточной обработке. Если приходится работать с таким кодом или сопровождать его, то нужно знать, как работает исходная многопоточная система. Во-вторых, в коде, опирающемся на TPL, могут по-прежнему использоваться элементы исходной многопоточной системы, и особенно ее средства синхронизации. И в-третьих, несмотря на то что сама библиотека TPL основывается на абстракции, называемой задачей, она по-прежнему неявно опирается на потоки и потоковые средства, описываемые в этой главе. Поэтому для полного усвоения и применения TPL потребуются твердые знания материала, излагаемого в этой главе.

И наконец, следует особо подчеркнуть, что многопоточная обработка представляет собой довольно обширную тему, и поэтому подробное ее изложение выходит за рамки этой книги. В этой и последующей главах представлен лишь беглый обзор данной темы и демонстрируется ряд основополагающих методик. Следовательно, материал этих глав может служить введением в эту важную тему и основанием для дальнейшего ее самостоятельного изучения.


Основы многопоточной обработки

Различают две разновидности многозадачности: на основе процессов и на основе потоков. В связи с этим важно понимать отличия между ними. Процесс фактически представляет собой исполняемую программу. Поэтому многозадачность на основе процессов — это средство, благодаря которому на компьютере могут параллельно выполняться две программы и более. Так, многозадачность на основе процессов позволяет одновременно выполнять программы текстового редактора, электронных таблиц и просмотра содержимого в Интернете. При организации многозадачности на основе процессов программа является наименьшей единицей кода, выполнение которой может координировать планировщик задач.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*