- •Атрибуты в среде .Net и языке c#.
- •Метаданные
- •Понятие атрибутов
- •Предопределенные и собственные атрибуты
- •Потребители атрибутов
- •Применение атрибутов
- •Сокращенное именование атрибутов
- •Создание собственных атрибутов:
- •Применение собственных атрибутов:
- •Ограничение использования атрибутов:
- •Атрибуты уровня сборки и модуля:
- •Рефлексия атрибутов:
- •Выводы:
- •Язык xml. Классы платформы .Net для работы с xml-данными.
- •Синтаксис xml
- •Работа с xml при помощи System.Xml
- •Работа с xml при помощи linq to xml
- •Выводы:
- •Потоковый ввод-вывод. Файлы. Работа с файлами и каталогами. Пространство имен System.Io
- •Классы Directory (DirectoryInfo) и File (FileInfo) Некоторые общие свойства классов DirectoryInfo и FileInfo:
- •Дополнительные возможности класса DirectoryInfo
- •Дополнительные возможности класса FileInfo
- •Дополнительные члены File
- •Потоковый ввод-вывод
- •Работа с классом FileStream
- •Работа с классами StreamWriter и StreamReader
- •Классы StringWriter и StringReader
- •Работа с классами BinaryWriter и BinaryReader
- •Выводы:
- •Сериализация. Атрибуты. Стандартные форматы сериализации. Понятие сериализации объектов
- •Роль графов объектов
- •Конфигурирование объектов для сериализации
- •Общедоступные поля, приватные поля и общедоступные свойства
- •Стандартные форматеры сериализации
- •Настройка сериализации с использованием атрибутов
- •Выводы:
- •Понятие бд и субд. Язык sql. Ado.Net как средство доступа из c# к субд. Понятие бд
- •Понятие субд
- •Обзор синтаксиса
- •Подключенный уровень
- •Автономный уровень
- •Основные свойства класса DataSet
- •Основные методы класса DataSet
- •Типы DataColumn и DataRow
- •Основные члены типа DataColumn:
- •Основные члены типа DataRow:
- •Работа с адаптерами данных:
- •Основные члены класса DbDataAdapter:
- •Параллельные вычисления. Многозадачность и многопоточность.
- •Некоторые члены класс Process:
- •Некоторые члены класса ProcessThread
- •Домены приложений
- •Некоторые члены класс AppDomain:
- •Многопоточность. Классификация состояний потока. Средства многопоточного программирования System.Threading.
- •Некоторые члены пространства имен System.Threading
- •Основные члены класс Thread
- •Состояния потока
- •Многопоточное программирование при помощи асинхронных вызовов делегатов
- •Создание вторичных потоков при помощи Thread.Start()
- •Синхронизация с помощью lock
- •Синхронизация с использованием типа System.Threading.Monitor
- •Синхронизация с использованием типа System.Threading.Interlocked
- •Синхронизация с использованием атрибута [Synchronization]
- •Использование System.Threading.Timer
- •Пул потоков clr
- •Библиотека Windows.Forms. Пространства имен. Структура приложения. Элементы управления. События. Иерархия элементов управления.
- •Основные пространства имен Windows Forms
- •Структура приложения WinForms
- •Элементы управления
- •События
- •Библиотека wpf. Отличия wpf от WindowsForms. Разметка xaml. Понятие Windows Presentation Foundation
- •Типы приложений wpf
- •Основные сборки wpf
- •Построение приложения wpf без xaml
- •Построение приложения wpf с использованием только xaml
- •Пример c# обработчика события для контрола, объявленного в xaml (связь кода и xaml):
- •Создание проекта
- •Знакомство с инструментами визуального конструктора wpf
Создание вторичных потоков при помощи Thread.Start()
При программном создании дополнительных потоков для выполнения некоторой единицы работы необходимо следовать строго регламентированному процессу.
Создать метод, который будет точкой входа для нового потока.
Создать новый делегат ParametrizedThreadStart (или ThreadStart), передав конструктору адрес метода, определенного на шаге 1.
Создать объект Thread, передав в качестве аргумента конструктора ParametrizedThreadStart/ThreadStart.
Установить начальные характеристики потока (имя, приоритет и т.п.).
Вызвать метод Thread.Start(). Это запустит поток на методе, который указан делегатом, созданным на шаге 2, как только это будет возможно.
Пример:
// класс для передачи параметров
class Params
{
public int a, b;
public Params(int a, int b)
{
this.a = a;
this.b = b;
}
}
// Тестовый класс
class Test
{
// метод, который будт выполняться в отдельном потоке (шаг 1)
static void Add(object data)
{
if ( data is Params )
{
AddParams ap = (AddParams)data;
// используем параметры
}
}
static void Launch()
{
// Создать объект Params для передачи вторичному потоку
Params p = new Params(10, 10);
// Создать делегат и объект Thread (шаги 2, 3)
Thread t = new Thread(new ParameterizedThreadStart(Add));
// Запустить поток (шаг 5) и передать ему параметр
t.Start(p);
}
}
Запуск потока с использованием ThreadStart практически не отличается от запуска потока через ParametrizedThreadStart, за исключением того, что методы для ThreadStart не должны принимать никаких параметров.
Синхронизация с помощью lock
// Маркер блокировки.
private object threadLock = new object();
public void function()
{
// Использование маркера блокировки,
lock ( threadLock )
{
// Весь код внутри этого контекста безопасен к потокам.
}
}
Синхронизация с использованием типа System.Threading.Monitor
Фактически, компилятор преобразует предыдущий пример в код вида
// Маркер блокировки.
private object threadLock = new object();
public void Function()
{
// Использование блокировки
Monitor.Enter(threadLock);
try
{
// Весь код внутри этого контекста безопасен к потокам.
}
finally
{
// снять блокировку
Monitor.Exit(threadLock);
}
}
Синхронизация с использованием типа System.Threading.Interlocked
System.Threading.Interlocked предоставляет функциональность для потокобезопасного манипулирования одним элементом данных, например:
Decrement() |
Безопасно уменьшает значение параметра на 1 |
Exchange() |
Безопасно меняет значения двух параметров местами |
Increment() |
Безопасно уменьшает значение параметра на 1 |
Синхронизация с использованием атрибута [Synchronization]
Для обеспечения потокобезопасной работы целого класса, он помечается атрибутом [Synchronization]. Класс должен наследовать от ContextBoundObject . Данный подход требует аккуратного использования, поскольку синхронизации подвергаются все члены отмеченного класса, вне зависимости от того, действительно ли это нужно, что может замедлить работу программы.