Добавлено решение с примерами из книги Kort W. - Exam Ref 70-483. Programming in C#.
Запуск потока в фоновом режиме.
Пример использующий параметризованный делегат, позволяющий передать данные в созданный поток.
В данном примере для остановки потока используется глобальная переменная stopped. А поток задан с помощью лямбда-выражения.
Потоки могут иметь собственные данные, не являющиеся локальными по отношению к потоку. Путем установки поля с атрибутом ThreadStatic, каждый поток получает свою собственную копию поля.
Если вы хотите использовать локальные данные и инициализировать их для каждого потока можно использовать класс ThreadLocal<T>.
Использование потока из пула потоков.
В этом примере создается задача, которая использует поток из пула потоков. Вызов Wait эквивалентен Join.
Здксь создается задача, которая возвращает результат. Основной поток ждет результата и выводит его в консоль.
Добавлена continuation task (Продолжающаяся задача). Она позволяет использовать результат предыдущего выполнения задачи.
Метод ContinueWith имеет несколько перегрузок, которые могут использоваться для управления продолжением выполнения задачи.
Еще одна разновидность продолжающихся задач - это задачи имеющие несколько дочерних задач. Задача завершится только после завершения всех задач.
В этом примере для создания дочерних задач используется объект TaskFactory, который создает задачи с заданными свойствами.
В этом примере используется метод Task.WaitAll для ожидания завершения всех задач.
В данном примере используется метод WaitAny которая ждет когда завершится любая из задач.
Добавлен пример с использованием Parallel.For и Parallel.ForEach методов, которые позволяют задаче выполняться параллельно.
В данном примере для остановки цикла используется объект ParallelLoopState.
Реализован пример с использованием асинхронного метода. Этот метод загружает web-страницу из интернета.
Сравнение двух задач Scalability vs responsiveness.
Добавлен пример с использованием асинхронного метода при нажатии на кнопку. Данный пример вызовет ошибку ( Output.Content = content; ), поскольку ConfigureAwait(false).