Полное руководство. С# 4.0 - Шилдт Герберт
Вот к какому результату приводит выполнение этой программы (опять же все зависит от конкретных настроек языковых и региональных параметров локализации базового программного обеспечения).Время: 11:19 AMВремя 24-часовом формате: 11:19Дата: Thu Feb 11, 2010Эра: A.D.Время в секундах: 11:19:40 AMДень месяца в формате m: February 11Минуты в формате т: 19Форматирование промежутков времени
Начиная с версии 4.0, в среде .NET Framework появилась возможность форматировать объекты типа TimeSpan — структуры, представляющей промежуток времени.Объект типа TimeSpan может быть получен самыми разными способами, в том числеи в результате вычитания одного объекта типа DateTime из другого. И хотя форматировать объекты типа TimeSpan приходится нечасто, о такой возможности все же стоитупомянуть вкратце.
По умолчанию в структуре TimeSpan поддерживаются три стандартных спецификатора формата даты и времени: с, g и G. Они обозначают инвариантную формупромежутка времени, короткую и длинную форму с учетом культурной среды соответственно (последняя форма всегда включает в себя дни). Кроме того, в структуреTimeSpan поддерживаются специальные спецификаторы формата даты и времени,приведенные в табл. 22.9. Вообще говоря, если один из этих спецификаторов используется в отдельности, его нужно предварить символом %.
Таблица 22.9. Символы-заполнители специального формата промежутка времениСимвол-заполнительНазначениеd, dd, ddd, dddd, ddddd, dddddd, dddddddЦелые дни. Если указано несколько символов-заполнителей d, то отображается, по крайней мере, указанное количество цифр с начальными нулями, если требуетсяh, hhЧасы (не считая тех, что составляют часть целого дня). Если указано hh, то отображаются две цифры с начальными нулями, если требуетсяm, mmМинуты (не считая тех, что составляют часть целого часа). Если указано mm, то отображаются две цифры с начальными нулями, если требуетсяs, ssСекунды (не считая тех, что составляют часть целой минуты). Если указано ss, то отображаются две цифры с начальными нулями, если требуетсяf, ff, fff, ffff, fffff, ffffff, fffffffДробные доли секунды. Количество символов-заполнителей f обозначает точность представления, а остальные цифры отбрасываютсяF, FF, FFF, FFFF, FFFFF, FFFFFF, FFFFFFFДробные доли секунды. Количество символов-заполнителей 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 990991 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То же, что и DFОтображает имя значения. Если это значение можно создать путем логического сложения по ИЛИ двух или более полей, определенных в перечислении, то данный спецификатор отображает имена всех битовых составляющих заданного значения, причем независимо от того, задан атрибут Flags или нетfТо же, что и FGОтображает имя значения. Если перед форматируемым перечислением указывается атрибут Flags, то данный спецификатор отображает имена всех битовых составляющих заданного значения, если, конечно, это допустимое значениеgТо же, что и GXОтображает значение в виде шестнадцатеричного целого числа. Для отображения как минимум восьми цифр форматируемое значение дополняется (при необходимости) начальными нулями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); }}
Ниже приведен результат выполнения этой программы.WestWest300000003Ready, TransmitOKReady, TransmitOK900000009
ГЛАВА 23. Многопоточное программирование. Часть первая: основы
Среди многих замечательных свойств языка С# особоеместо принадлежит поддержке многопоточного программирования. Многопоточная программа состоитиз двух иди более частей, выполняемых параллельно. Каждая часть такой программы называется потоком и определяет отдельный путь выполнения команд. Таким образом,многопоточная обработка является особой формой многозадачности.Многопоточное программирование опирается на целый ряд средств, предусмотренных для этой цели в самомязыке С#, а также на классы, определенные в среде .NETFramework. Благодаря встроенной в C# поддержке многопоточной обработки сводятся к минимуму или вообщеустраняются многие трудности, связанные с организациеймногопоточной обработки в других языках программирования. Как станет ясно из дальнейшего, поддержка в C#многопоточной обработки четко организована и простадля понимания.С выпуском версии 4.0 в среде .NET Framework появились два важных дополнения, имеющих отношение к многопоточным приложениям. Первым из них является TPL(Task Parallel Library — Библиотека распараллеливания задач), а вторым — PLINQ (Parallel LINQ — Параллельныйязык интегрированных запросов). Оба дополнения поддерживают параллельное программирование и позволяют использовать преимущества, предоставляемые многопроцессорными (многоядерными) компьютерами в отношенииобработки данных. Кроме того, библиотека TPL упрощаетсоздание многопоточных приложений и управление ими.В силу этого многопоточная обработка, опирающаяся на23TPL, рекомендуется теперь как основной подход к разработке многопоточных приложений. Тем не менее накопленный опыт создания исходной многопоточной подсистемы по-прежнему имеет значение по целому ряду причин. Во-первых, уже существуетнемалый объем унаследованного кода, в котором применяется первоначальный подход к многопоточной обработке. Если приходится работать с таким кодом или сопровождать его, то нужно знать, как работает исходная многопоточная система. Во-вторых,в коде, опирающемся на TPL, могут по-прежнему использоваться элементы исходноймногопоточной системы, и особенно ее средства синхронизации. И в-третьих, несмотря на то что сама библиотека TPL основывается на абстракции, называемой задачей,она по-прежнему неявно опирается на потоки и потоковые средства, описываемыев этой главе. Поэтому для полного усвоения и применения TPL потребуются твердыезнания материала, излагаемого в этой главе.И наконец, следует особо подчеркнуть, что многопоточная обработка представляетсобой довольно обширную тему, и поэтому подробное ее изложение выходит за рамки этой книги. В этой и последующей главах представлен лишь беглый обзор даннойтемы и демонстрируется ряд основополагающих методик. Следовательно, материалэтих глав может служить введением в эту важную тему и основанием для дальнейшегоее самостоятельного изучения.Основы многопоточной обработки