TAP Flashcards

1
Q

Неявное создание и запуск задач

A

Parallel.Invoke(() => DoSomeWork(), () => DoSomeOtherWork());

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Равно ли количество созданных экземпляров методом Invoke количеству переданных делегатов

A

Число экземпляров Task, созданных Invoke в фоновом режиме, не обязательно равно числу предоставленных делегатов. Библиотека параллельных задач может применять различные оптимизации, особенно с большим количеством делегатов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

В каком случае предпочтительно использовать методы Run()

A

Методы Run — предпочтительный способ создания и запуска задач, если не требуется более жесткий контроль над созданием и планированием задачи.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

В каком случае предпочтительно использовать Task.Factory.StartNew()

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

К каким переменными имеется доступ при использовании лямбда выражений для создания делегата

A

При использовании лямбда-выражения для создания делегата имеется доступ ко всем переменным, видимым на этом этапе в исходном коде

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Какие проблемы могут возникнут с захватом переменных в циклах

A

В некоторых случаях, особенно в циклах, лямбда-выражение не перехватывает переменную, как можно было бы ожидать. Оно только перехватывает окончательное значение, а не значение, изменяющееся после каждой итерации.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Как решить проблему с захватом переменных в циклах

A

Доступ к значению для каждой итерации можно получить, предоставив объект состояния задаче через ее конструктор.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Каким образом из объекта задачи можно получить доступ к объекту состояния

A

Состояние передается в качестве аргумента делегату задачи, и доступ к нему можно получить из объекта задачи с помощью свойства Task.AsyncState.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Каким образом можно указать планировщику задач способ планирования задачи в пуле потоков

A

API, в которых создаются задачи, предоставляют перегрузки, принимающие параметр TaskCreationOptions. Указывая один из этих параметров, пользователь задает планировщику задач способ планирования задачи в пуле потоков.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Как указать задачу, которую нужно выполнять по завершению предыдущей

A

С помощью методов Task.ContinueWith и Task.ContinueWith можно указать задачу, которую нужно запускать по завершении предшествующей задачи.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Как избежать создания нескольких экземпляров задач - продолжения для каждой предшествующей задачи

A

Поскольку метод Task.ContinueWith является экземплярным, вызовы этого метода можно объединять в цепочку, а не создавать экземпляр объекта Task для каждой предшествующей задачи.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Создание отсоединенных дочерних задач и их особенность

A

Если в пользовательском коде, выполняемом в некоторой задаче, создается новая задача и не задается параметр AttachedToParent, новая задача не синхронизируется с родительской никаким особым способом.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Создание присоединенной дочерней задачи

A

Если пользовательский код, который выполняется в задаче, создает новую задачу с параметром AttachedToParent, эта новая задача считается присоединенной дочерней задачей родительской задачи.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Каковы основные причины ожидания задач

A

Как правило, ожидание задачи выполняется по одной из следующих причин.

* Основной поток зависит от конечного результата, вычисленного задачей.
* Необходимо обрабатывать исключения, которые могут быть созданы из задачи.
* Приложение может завершиться до окончания выполнения всех задач. Например, выполнение консольных приложений завершается после выполнения всего синхронного кода в Main (точке входа приложения).
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Какие экземплярные и статические методы позволяют ожидать завершения задач

A

WhenAll, WhenAny, Delay и FromResult

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Как отменить ожидание/выполнение

A

Можно создать токен и выдать запрос отмены позднее с помощью класса CancellationTokenSource.

17
Q

В каких случаях полезен метод WhenAny

A

Метод WhenAny особенно полезен в следующих ситуациях.

* Избыточные операции. Рассмотрим алгоритм или операцию, которые можно выполнить несколькими способами. Метод WhenAny можно использовать для выбора операции, завершающейся первой, и последующей отмены оставшихся операций.
* Операции с чередованием. Можно запустить несколько операций, которые все должны завершиться, и использовать метод WhenAny для обработки результатов при завершении каждой операции. После завершения одной операции можно запустить одну или несколько дополнительных задач.
* Регулируемые операции. Метод WhenAny можно использовать для расширения предыдущего сценария путем ограничения количества одновременно выполняемых операций.
* Операции с истекшим сроком действия. Метод WhenAny можно использовать, чтобы сделать выбор между одной или несколькими задачами и задачей, завершающейся после определенного времени, например задачей, возвращаемой методом Delay.
18
Q

Какие основные методы представляет TaskFactory для создания, запуска задач и задач продолжения

A

StartNew, ContinueWhenAny, ContinueWhenAll, FromAsync

19
Q

Какие состояния возможны у задач

A
Canceled
	6
Created
	0
Faulted
	7
RanToCompletion
	5
Running
	3
WaitingForActivation
	1
WaitingForChildrenToComplete
	4
WaitingToRun
	2
20
Q

Задача продолжения

A

это асинхронная задача, вызываемая другой задачей, которая называется предшествующей, при завершении этой предшествующей задачи

21
Q

Что можно выполнить с помощью продолжений

A
  • Передавать данные из предшествующей задачи в продолжение.
  • Указывать точные условия, при которых продолжение будет вызываться или не будет вызываться.
  • Отменять продолжение перед его запуском либо совместно с его выполнением.
  • Определять подсказки, как должно планироваться продолжение.
  • Вызывать несколько продолжений из одной и той же предшествующей задачи.
  • Вызывать одно продолжение по завершении всех или одной из нескольких предшествующих задач.
  • Прикреплять продолжения одно после другого до любой произвольной длины.
  • Использовать продолжение для обработки исключений, вызванных предшествующей задачей.
22
Q

В каком состоянии создается задача-продолжение

A

Продолжение — это задача, созданная в состоянии WaitingForActivation

23
Q

Что будет если вызвать Task.Start в продолжении в пользовательском коде

A

вызывает исключение System.InvalidOperationException

24
Q

Создание продолжения для одной предшествующей задачи

A

Task taskA = Task.Run( () => …)

Task continuation = taskA.ContinueWith(antecedent =>…)

25
Q

Если предшествующие задачи завершаются успешно - какой их статус?

A

свойство Task.Status имеет значение TaskStatus.RanToCompletion

26
Q

Какие методы позволяют создавать продолжения

A

Статические:

  • Task.WhenAll
  • Task.WhenAny

Экземплярные:

  • TaskFactory.ContinueWhenAll
  • TaskFactory.ContinueWhenAny
27
Q

Как задаются параметры продолжения

A

можно использовать перегрузку ContinueWith, принимающую значение перечисления System.Threading.Tasks.TaskContinuationOptions

28
Q

Как Task.ContinueWith передает ссылку на предшествующую задачу

A

В виде аргумента в пользовательский делегат продолжения

29
Q

В каком случае можно получить в продолжении доступ к св-ву Task.Result предшествующей задачи

A

Если предшествующая задача является объектом System.Threading.Tasks.Task и эта задача выполнялась до своего завершения

30
Q

В каком случае попытка доступа к св-ву Result вызовет исключение AggregateException

A

если задача была отменена или произошел сбой

31
Q

Как заставить продолжение выполняться только когда предшествующая задача выполнилась успешно

A

используя в .ContinueWith параметр TaskContinuationOptions.OnlyOnRanToCompletion

32
Q

В каких случаях свойство Task.Status продолжения устанавливается в значение TaskStatus.Canceled

A
  • В ответ на запрос отмены вызывается исключение OperationCanceledException . Как и в любой другой задаче, если исключение содержит тот же токен, что и переданный в продолжение, то он рассматривается как подтверждение совместной отмены.
  • Продолжение передает объект System.Threading.CancellationToken, свойство IsCancellationRequested которого имеет значение true. В этом случае продолжение не запускается и переходит в состояние TaskStatus.Canceled.
  • Продолжение никогда не запускается, поскольку условие, заданное его аргументом TaskContinuationOptions , не выполнено. Например, если предшествующая задача переходит в состояние TaskStatus.Faulted, ее продолжение, которое передало параметр TaskContinuationOptions.NotOnFaulted, не будет выполняться, но перейдет в состояние Canceled.
33
Q

Конкурентность (concurrency)

A

общий термин, который говорит, что одновременно выполняется более одной задачи

34
Q

Параллельное исполнение (parallel computing)

A

подразумевает наличие более одного вычислительного устройства (например, процессора), которые будутодновременновыполнять несколько задач

35
Q

Многопоточность

A

один из способов реализации конкурентного исполнения путем выделения абстракции “рабочего потока” (worker thread).

36
Q

Асинхронность (asynchrony)

A

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

37
Q

CPU-bound и IO-Bound операции

A

CPU-Bound операции нагружают вычислительные мощности текущего устройства, а IO-Bound позволяют выполнить задачу вне текущей железки.