Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
к зачету по техпрог.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
139.43 Кб
Скачать

Минимально необходимые действия для использования BackgroundWorker:

  • Создать экземпляр BackgroundWorker и назначить обработчик для события DoWork.

  • Вызвать RunWorkerAsync, если необходимо – с нужным object в качестве аргумента.

После этих действий начнется исполнение. Аргумент, переданный в RunWorkerAsync, будет перенаправлен в обработчик DoWork как свойство Argument параметраDoWorkEventArgs.

BackgroundWorker также предоставляет событие RunWorkerCompleted, которое генерируется после завершения выполнения действий обработчика события DoWork. 

ОбработкаRunWorkerCompleted необязательна, но обычно применяется, хотя бы для того, чтобы получить информацию о возможных исключениях в DoWork. 

Чтобы добавить отображение выполнения операции:

  • Установить свойство WorkerReportsProgress в true.

  • Периодически вызывать ReportProgress из обработчика DoWork с указанием количества “выполненных процентов”.

  • Обрабатывать событие ProgressChanged, запрашивая войство ProgressPercentage его аргумента.

Чтобы иметь возможность отмены операции:

  • Установить свойство WorkerSupportsCancellation в true.

  • Периодически проверять свойство CancellationPending в обработчике DoWork – если оно установлено в true, установить свойство Cancel аргумента DoWorkEventArgs в true и сделать return.

  • Для запроса отмены операции вызывать CancelAsync.

Задачи (класс Task)

  • Task – инкапсулирует единицу работы

  • Task<TResult> - единица работы с определенным типом результата

  • TaskFactory, TaskFactory<TResult> – фабрики создания задач

  • TaskScheduler – управляет «расписанием» запуска задач

  • TaskCompletionSource – управляет «временем жизни» задачи

В основу TPL положен класс Task. Элементарная единица исполнения инкапсулируется в TPL средствами класса Task, а не Thread. Класс Task отличается от класса Thread тем, что он является абстракцией, представляющей асинхронную операцию. А в классе Thread инкапсулируется поток исполнения.

Исполнением задач управляет планировщик задач, который работает с пулом потоков. Это, означает, что несколько задач могут разделять один и тот же поток.

Работа с задачами, как правило, включает три основные операции: объявление задачи, добавление задачи в очередь готовых задач, ожидание завершения выполнения задачи.

  • Важное отличие заключается в том, что вызов метода Start для задачи не создает новый поток, а помещает задачу в очередь готовых задач – пул потоков. 

  • Планировщик (TaskScheduler) в соответствии со своими правилами распределяет готовые задачи по рабочим потокам. Действия планировщика можно корректировать с помощью параметров задач. Момент фактического запуска задачи в общем случае не определен и зависит от загруженности пула потоков.

Статусы задачи

Задача может находиться в нескольких состояниях: 

  • Created, 

  • Running, 

  • WaitingToRun, 

  • Faulted, 

Canceled,

RanToCompletion, 

WaitingForActivation, 

WaitingForChildrenToComplete.