
- •Организация c#-системы ввода-вывода: байтовые и символьные потоки. Встроенные потоки.
- •Классы потоков. Класс Stream. Классы байтовых потоков. Классы символьных потоков. Классы двоичных потоков.
- •Класс FileStream и файловый ввод-вывод на побайтовой основе. Открытие и закрытие файла. Запись данных в файл. Считывание байтов из объекта класса FileStream.
- •Файловый ввод-вывод с ориентацией на символы. Использование класса StreamWriter. Использование класса StreamReader.
- •Считывание и запись двоичных данных. Класс BinaryWriter. Класс BinaryReader.
- •6. Навигация по файловой системе: классы для работы с файловой системой.
- •7. Получение сведений о файле; копирование файлов; перечисление файлов в папке; изменение расширения файлов.
- •5.3. Изменение расширения файлов
- •8. Основы организации потоков. Потоки и многозадачность. Пространство имен System.Threading. Класс Thread. Создание потока.
- •9. Использование нескольких потоков. Планирование потоков, приоритеты потоков.
- •10. Проблемы одновременности и синхронизации потоков. Общий доступ к данным из разных потоков, предотвращение коллизий.
- •11. Синхронизация доступа к общим данным с помощью блокировок. Управление временем существования потоков.
- •12. Краткий обзор ado.Net. Три стороны технологии ado.Net. Пространство имен System.Data.
- •13. Поставщики данных ado.Net. Поведение объектов подключения.
- •14. Объектная модель ado.Net
- •16. Создание соединения с источником данных. Члены типа dbConnection. Обработка исключений при работе с ms sql
- •Конструкторы
- •Свойства
- •События
- •17. Работа с бд с пом. Sql-запросов. Класс SqlCommand. Объект Command. Создание и инициализация. Командная строка sql-запроса CommandText.
- •Конструкторы
- •Свойства
- •18. Выборка, добавление, удаление и обновление данных с помощью sql-запросов на подсоединенном уровне.
- •19. Вывод информации с использованием объекта чтения данных: создание SqlDataReader; чтение данных из DataReader; чтение полей из текущей записи; закрытие DataReader.
- •20. Организация хранения данных. Объект DataSet
- •21. Таблицы и поля: объекты DataTable и DataColumn
- •22. Строки: объект DataRow
- •23. Связи между таблицами: объект DataRelation
- •24. Создание подключения к базе данных. Управляемые провайдеры
- •25. Объект DataAdapter. Класс SqlDataAdapter
- •Конструкторы:
- •Свойства
- •Организация c#-системы ввода-вывода: байтовые и символьные потоки. Встроенные потоки.
9. Использование нескольких потоков. Планирование потоков, приоритеты потоков.
Приоритет потоков. Класс Thead поддерживает установку и получение приоритета потока. Для этого использ перечисление ThreadPriority. Его значения:
Highest Наивысший приоритет
Above Normal Приоритет выше обычного (Normal)
Normal Приоритет по умолчанию
Below Normal Приоритет ниже обычного
Lowest Самый низкий приоритет
В большинстве случаев следует использовать приоритет по умолчанию (Normal). Повышение или понижение приоритета может привести к тому, что ОС придется выделить некоторым потокам гораздо больше (или меньше) ресурсов, чем ожидалось. А если назначить некоторому потоку наивысший приоритет, остальные операции в системе могут просто остановиться. Порой повышать и понижать приоритет приходится, но делайте это с осторожностью. Надолго повысив приоритет одного потока, вы вряд ли сможете повысить производительность системы в целом, т. к. при этом возникнет нехватка ресурсов у др потоков, что может привести к непредсказуемым результатам.
Часто в многопоточной программе нужно позаботиться о том, чтобы основной поток завершался последним. Формально программа продолжает выполн до тех пор, пока не завершатся все высокоприоритет потоки. Т. обр., совсем необязательно завершение основного потока последним. Однако добиваться этого — один из признаков хорошего стиля программирования, поскольку в этом случае ясно определяется конечная точка программы.
Использование нескольких потоков. Можно создавать в программе несколько дочерних потоков.
Задание: Выполнить одну операцию в нескольких потоках.
Создать статический метод SimpleWork() в классе MultiThread (перед методом Main), который выводит на экран Id-номер каждого потока:
class MultiThread
{ static void SimpleWork()
{ Console.WriteLine("Thread: " + Thread.CurrentThread.ManagedThreadId); }
static void Main(string[] args)
{ ThreadStart operation = new ThreadStart(SimpleWork);
for (int x = 1; x <= 5; ++x)
{ // Создаем новый поток, но не запускаем его
Thread theThread = new Thread(operation);
// Запускаем задачу в новом потоке
theThread.Start();
}
Здесь заданная операция выполняется в пяти отдельных потоках. Синхронность работы этих потоков зависит от возможностей компьютера. После внесения этих изменений мы получим пять потоков, каждый из которых выводит в окне консоли собственный идентификатор:
Thread: 3
Thread: 4
Thread: 5
Thread: б
Thread: 7
Номера потоков выводятся последовательно, так как выполняемая методом SimpleWork операция завершается очень быстро. Попробуем запрограммировать более сложную операцию, чтобы изучить синхронную работу потоков:
Задание: Замедлить работу потока, позволяя другим потокам продолжить выполнение.
static void SimpleWork()
{
for (int x = 1; x <= 10; ++x)
{
Console.WriteLine("Thread: " + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("Номер итерации " + x);
Thread.Sleep(50);
}
}
// В Main():
for (int x = 1; x <= 3; ++x)
{
Thread theThread = new Thread(operation);
theThread.Start();
}
В методе SimpleWork мы выводим на экран идентификатор потока (их три) 10 раз. Кроме того, мы используем Thread.Sleep, чтобы замедлить работу кода. Метод Thread.Sleep позволяет приостановить выполнение потока на заданное время (в миллисекундах), тогда как остальные потоки будут продолжать работу. Работа каждого потока останавливается на 50 миллисекунд, и другие потоки в это время выводят свои данные на консоль. Чтобы посмотреть, как это работает, мы изменили метод SimpleWork так, чтобы он показывал номер текущей итерации:
Thread:3
Thread:4
Thread:5
Thread:6
Thread:7
Thread:3
Thread:4
Thread:5
Thread:6
Thread:7
Это позволило достичь максимально параллельного выполнения операций, возможного для компьютера с данной конфигурацией.