В приведенной ниже программе демонстрируется применение спецификаторов формата перечислений. // Отформатировать перечисление. 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. Многопоточное программирование. Часть первая: основы
Среди многих замечательных свойств языка С# особое место принадлежит поддержке многопоточного про граммирования. Многопоточная программа состоит из двух иди более частей, выполняемых параллельно. Каж дая часть такой программы называется потоком и опреде ляет отдельный путь выполнения команд. Таким образом, многопоточная обработка является особой формой много задачности. Многопоточное программирование опирается на це лый ряд средств, предусмотренных для этой цели в самом языке С#, а также на классы, определенные в среде .NET Framework. Благодаря встроенной в C# поддержке много поточной обработки сводятся к минимуму или вообще устраняются многие трудности, связанные с организацией многопоточной обработки в других языках программиро вания. Как станет ясно из дальнейшего, поддержка в C# многопоточной обработки четко организована и проста для понимания. С выпуском версии 4.0 в среде .NET Framework появи лись два важных дополнения, имеющих отношение к мно гопоточным приложениям. Первым из них является TPL (Task Parallel Library — Библиотека распараллеливания за дач), а вторым — PLINQ (Parallel LINQ — Параллельный язык интегрированных запросов). Оба дополнения поддер живают параллельное программирование и позволяют ис пользовать преимущества, предоставляемые многопроцес сорными (многоядерными) компьютерами в отношении обработки данных. Кроме того, библиотека TPL упрощает создание многопоточных приложений и управление ими. В силу этого многопоточная обработка, опирающаяся на 23 TPL, рекомендуется теперь как основной подход к разработке многопоточных прило жений. Тем не менее накопленный опыт создания исходной многопоточной подсисте мы по-прежнему имеет значение по целому ряду причин. Во-первых, уже существует немалый объем унаследованного кода, в котором применяется первоначальный под ход к многопоточной обработке. Если приходится работать с таким кодом или сопро вождать его, то нужно знать, как работает исходная многопоточная система. Во-вторых, в коде, опирающемся на TPL, могут по-прежнему использоваться элементы исходной многопоточной системы, и особенно ее средства синхронизации. И в-третьих, несмо тря на то что сама библиотека TPL основывается на абстракции, называемой задачей, она по-прежнему неявно опирается на потоки и потоковые средства, описываемые в этой главе. Поэтому для полного усвоения и применения TPL потребуются твердые знания материала, излагаемого в этой главе. И наконец, следует особо подчеркнуть, что многопоточная обработка представляет собой довольно обширную тему, и поэтому подробное ее изложение выходит за рам ки этой книги. В этой и последующей главах представлен лишь беглый обзор данной темы и демонстрируется ряд основополагающих методик. Следовательно, материал этих глав может служить введением в эту важную тему и основанием для дальнейшего ее самостоятельного изучения. Основы многопоточной обработки