- •Организация c#-системы ввода-вывода: байтовые и символьные потоки. Встроенные потоки.
- •Классы потоков. Класс Stream. Классы байтовых потоков. Классы символьных потоков. Классы двоичных потоков.
- •1.5. Классы символьных потоков:
- •1.6. Классы двоичных потоков:
- •Класс FileStream и файловый ввод-вывод на побайтовой основе. Открытие и закрытие файла. Запись данных в файл. Считывание байтов из объекта класса FileStream.
- •Файловый ввод-вывод с ориентацией на символы. Использование класса StreamWriter. Использование класса StreamReader.
- •Считывание и запись двоичных данных. Класс BinaryWriter. Класс BinaryReader.
- •Наиболее важные методы выходного потока BinaryWriter:
- •Навигация по файловой системе: классы для работы с файловой системой.
- •Получение сведений о файле; копирование файлов; перечисление файлов в папке; изменение расширения файлов.
- •5.3. Изменение расширения файлов
- •Основы организации потоков. Потоки и многозадачность.
- •Пространство имен System.Threading. Класс Thread. Создание потока.
- •Создание потока. Чтобы создать поток, необходимо создать объект типа Thread. В классе Thread определен следующий конструктор: public Thread(ThreadStart entryPoint),
- •Приоритет потоков. Класс Thead поддерживает установку и получение приоритета потока. Для этого используется перечисление ThreadPriority. Его значения:
- •Использование нескольких потоков. Планирование потоков, приоритеты потоков. Можно создавать в программе несколько дочерних потоков.
- •Создать статический метод SimpleWork() в классе MultiThread (перед методом Main), который выводит на экран Id-номер каждого потока:
- •Проблемы одновременности и синхронизации потоков. Общий доступ к данным из разных потоков, предотвращение коллизий.
- •Синхронизация доступа к общим данным с помощью блокировок.
- •2) Выполнить блокировку операторов в ранее используемых методах SimpleWork и run:
- •Управление временем существования потоков.
- •Краткий обзор ado.Net. Три стороны технологии ado.Net. Пространство имен System.Data.
- •2.2 Три стороны технологии ado.Net
- •15.Поставщики данных ado.Net. Поведение объектов подключения.
- •Объектная модель ado.Net.
- •Создание соединения с источником данных. Члены типа dbConnection. Обработка исключений при работе с ms sql
- •Конструкторы
- •Свойства
- •События
- •Конструкторы
- •Свойства
- •Выборка, добавление, удаление и обновление данных с помощью sql-запросов на подсоединенном уровне.
- •Вывод информации с использованием объекта чтения данных: создание SqlDataReader; чтение данных из DataReader; чтение полей из текущей записи; закрытие DataReader.
- •Сравнение DataReader и DataSet:
- •Чтение данных из DataReader:
- •Организация хранения данных. Объект DataSet.
- •Строки: объект DataRow.
- •Конструкторы:
- •Свойства
- •Передача данных между источником данных и объектом DataSet. Обновление базы данных с помощью адаптера данных.
Получение сведений о файле; копирование файлов; перечисление файлов в папке; изменение расширения файлов.
Для указания полного пути к файлу удобно использовать Дословные литералы или Дословное применение. Эти литералы предваряются символом @, который отключает обработку управляющих последовательностей (например, \n) и позволяет получать строки в таком виде, в котором они записаны. В дословных литералах не требуется дублировать обратную косую черту.
Вот два варианта записи одного и того же пути:
“C:\\app\\bin\\a.exe”
@“C:\app\bin\a.exe”
Чтобы получить доступ к текущему каталогу приложения можно использовать обозначение: “.”
Примеры:
1) Привязка к текущему каталогу приложения:
DirectoyInfo dir1=new DirectoyInfo(“.”);
2) Привязка к каталогу C:\Windows с помощью дословного литерала:
DirectoyInfo dir2=new DirectoyInfo(@”C:\Windows” );
3) Привязка к несуществующему каталогу с последущим его созданием:
DirectoyInfo dir3=new DirectoyInfo(@”F:\СТП\ЛР” );
dir3.Create();
5.3. Изменение расширения файлов
Для управления путями файловой системы имеется статический класс Path. Он позволяет запрашивать и разбирать пути файловой системы.
Некоторые статические методы класса Path:
Методы класса |
Описание |
ChangeExtension() |
Принимает в качестве параметра путь и возвращает путь к файлу с другим расширением. Внимание! Изменяется только строка пути, расширение настоящего файла не изменяется. |
GetExtension() |
Возвращает расширение файла, соответствующего заданному пути. |
GetFileName() |
Возвращает имя файла, соответствующего заданному пути. |
GetFullPath() |
Возвращает полный путь, соответствующий заданному пути. |
GetPathRoot()
|
Возвращает корневой каталог из заданного пути.
|
Основы организации потоков. Потоки и многозадачность.
Приложение .NET состоит из одного или нескольких процессов. Процессу принадлежит выделенная для него область памяти и ресурсы, такие как внешние библиотеки программного кода, первичный поток. Каждый процесс может состоять из нескольких доменов (частей) приложения, ресурсы которых изолированы друг от друга. Домен приложения представляет собой обособленный логический раздел процесса, куда помещается выполняемый файл .NET (.exe). В рамках домена может быть запущено несколько потоков выполнения. Поток (thread)— это управляемая единица выполняемого кода. Иногда этот термин переводится буквально – «нить», чтобы отличить его от потоков ввода/вывода. Все процессы имеют, по крайней мере, один поток управления, который обычно называется основным (main thread) или первичным, поскольку именно с этого потока начинается выполнение программы. Из основного можно создать и другие потоки. Управление потоками осуществляет операционная система.
Таким образом, многопоточность представляет собой специальную форму многозадачности. Многопоточное программирование опирается на сочетание средств, предусмотренных языком С#, и классов, определенных в среде .NET Framework, т.е. поддержка многопоточности встроена в язык. В многозадачной среде, ориентированной на потоки, все процессы имеют, по крайней мере, один поток, но возможно и большее их количество. Это означает, что одна программа может выполнять сразу две и более задач. Например, текстовый редактор может форматировать текст и в то же время выводить что-либо на печать, поскольку эти два действия выполняются двумя отдельными потоками.
Преимущество многопоточности состоит в том, что она позволяет разрабатывать очень эффективные программы, поскольку предоставляет возможность с толком использовать вынужденное время ожидания (простоя), которое имеет место во многих программах. Общеизвестно, что большинство устройств ввода-вывода (сетевые порты, дисководы или клавиатура) работают гораздо медленнее, чем центральный процессор (ЦП). Поэтому в программах львиная доля времени выполнения зачастую тратится на ожидание окончания отправки информации устройству (или получения от него). Используя многопоточность, можно построить программу так, чтобы она в такие периоды ожидания выполняла другую задачу. Например, пока одна часть программы будет отправлять файл по электронной почте, другая ее часть может считывать входные данные с клавиатуры, а еще одна — буферизировать следующий блок данных для отправки в Internet.
Поток может находиться в одном из нескольких возможных состояний. Он может выполняться. Он может быть готовым к выполнению (как только получит время ЦП).
Выполняющийся поток может быть приостановлен, т.е. его выполнение временно прекращается. Позже оно может быть возобновлено. Поток может быть заблокирован в ожидании необходимого ресурса. Наконец, поток может завершиться, и уж в этом случае его выполнение окончено и продолжению (возобновлению) не подлежит.
В среде .NET Framework определено два типа потоков: высокоприоритетный (foreground) и низкоприоритетный, или фоновый (background). По умолчанию поток создается высокоприоритетным, но его тип можно изменить, т.е. сделать его фоновым. Единственное различие между высоко- и низкоприоритетным потоками состоит в том, что последний будет автоматически завершен, если все высокоприоритетные потоки в его процессе остановились.
Существуют также и недостатки многопоточного программирования:
– большое количество потоков ведет к увеличению накладных расходов, связанных с их переключением, что снижает общую производительность системы;
– в многопоточных приложениях возникают проблемы синхронизации данных, связанные с потенциальной возможностью доступа к одним и тем же данным со стороны нескольких потоков.
Иногда издержки, связанные с созданием и диспетчеризацией потоков, могут привести к тому, что однопоточное приложение работает быстрее. Все зависит от того, что вы делаете и действительно ли вы можете распределить выполнение независимых задач между потоками. Например, если вам надо считать с диска три файла, создание для этого трех потоков не принесет вам пользы, поскольку все они будут обращаться к одному и тому же жесткому диску. Поэтому всегда старайтесь протестировать оба прототипа — однопоточную и многопоточную версию своей системы, прежде чем тратить время и средства на разработку решения, которое может быть неоправданно с точки зрения производительности.
