Учебный репозиторий с практическими материалами по продвинутым темам C#: работа с унаследованным кодом, управление процессами, многопоточность, асинхронное программирование, синхронизация, параллельные вычисления и динамическая загрузка библиотек.
Унаследованный код (Legacy Code) — код без тестов и документации с жесткими зависимостями и нарушением принципов SOLID.
Ключевые подходы:
- Анализ — изучение кода без изменений
- Рефакторинг — улучшение структуры без изменения поведения
- Обеспечение тестируемости — основа для безопасных изменений
- Методы работы:
- Sprout Method/Class — добавление нового функционала в чистые методы
- Wrap Method — оборачивание старых методов для добавления функциональности
Процесс — экземпляр выполняемой программы с изолированным окружением.
Основные сценарии:
- Запуск внешних приложений
- Мониторинг системных процессов
- Взаимодействие с процессами (ввод/вывод)
- Ожидание завершения процессов
Ключевой класс: System.Diagnostics.Process
Дополнительные материалы:
- https://github.com/VladimirRepp/CS---ChildeProcesses
- https://github.com/VladimirRepp/CS---CreateProcess
- https://github.com/VladimirRepp/CS---SimpleProcess
Поток (Thread) — наименьшая единица выполнения внутри процесса.
Асинхронность — освобождение потока во время операций ввода-вывода.
Ключевые концепции:
Thread,ThreadPool— управление потокамиTask,Task<T>— современная абстракция для асинхронных операцийasync/await— упрощение асинхронного кода- I/O-bound vs CPU-bound операции:
- I/O-bound (сеть, диск, БД) — идеально для
async/await - CPU-bound (вычисления) — лучше использовать
Task.Run
- I/O-bound (сеть, диск, БД) — идеально для
Дополнительные материалы:
- https://github.com/VladimirRepp/CS---Multithreading
- https://github.com/VladimirRepp/CS---AsynkTaskParallel
- https://github.com/VladimirRepp/CS---PoolThreads
Проблемы многопоточности:
- Race Condition — состояние гонки
- Deadlock — взаимная блокировка
- Data Corruption — порча данных
Примитивы синхронизации:
lock(Monitor) — эксклюзивная блокировкаMutex— межпроцессная блокировкаSemaphoreSlim— ограничение одновременного доступаManualResetEventSlim/AutoResetEvent— уведомления между потокамиReaderWriterLockSlim— множественное чтение, эксклюзивная запись
Важные правила:
- Минимизируйте объем кода в критических секциях
- Используйте неизменяемые структуры
- Никогда не блокируйте поток в
asyncметоде (кромеawait)
Дополнительные материалы:
Параллельное программирование — использование нескольких ядер CPU для одновременного выполнения задач.
Ключевые технологии:
- Parallel класс —
For,ForEach,Invoke - PLINQ —
AsParallel()для LINQ-запросов - TPL (Task Parallel Library) —
Task,Task<T>,TaskFactory
Отличие от многопоточности:
- Многопоточность — асинхронность и освобождение потоков при I/O
- Параллелизм — использование нескольких ядер для CPU-bound задач
Концепции:
- Степень параллелизма
- Разделение данных между потоками
- Агрегация результатов
Дополнительные материалы:
Динамическая загрузка — загрузка сборок во время выполнения.
Ключевые классы:
Assembly— загруженная сборкаType— представление типаActivator— создание экземпляровMethodInfo— информация о методах
Сценарии использования:
- Плагинная архитектура
- Загрузка реализаций по конфигурации
- "Горячая" замена модулей
Дополнительные материалы:
- https://github.com/VladimirRepp/CS---AppDomain
- https://github.com/VladimirRepp/CS---RunTwoAppUsingAppDoman
- https://github.com/VladimirRepp/CS---AssemblyAndModule
- .NET 9.0 SDK или новее
- IDE: Visual Studio 2022, Rider или VS Code
- здесь приведены примеры кода для решения задач
- задачи описаны в исходном файле кода
- для запуска кода потребуется создать новый проект в IDE или редакторе кода с .Net
- Module 6 на этапе тестирования