Как задачи работают на C #? Асинхронные / фоновые потоки — CloudSavvy IT

C #

Если вы хотите делать веб-запросы на C # или просто хотите выполнить некоторую фоновую обработку, вам нужно будет использовать асинхронные фоновые задачи, чтобы не блокировать основной поток. Мы обсудим, что это такое и как их использовать.

Что такое Async / Await?

Чтобы использовать Задачи, вы должны сначала понять концепцию async/await. Задачи C # не обязательно должны выполняться асинхронно, но, учитывая, что единственная их цель — представить асинхронную операцию, они почти всегда будут выполняться асинхронно. Вы не хотите запускать такие операции, как получение веб-запросов и запись на жесткие диски в основном потоке, потому что это будет задерживать остальную часть приложения (включая пользовательский интерфейс) в ожидании результата.

async/await специальный синтаксис, используемый для асинхронных операций. Если функция отмечена как async, он обычно возвращает Task, за исключением случаев обработчики событий, возвращающие void.

Внутри функции async вы можете использовать await ключевое слово для ожидания завершения асинхронных операций без блокировки всего потока. Все, что приходит после await ключевое слово будет запускаться только после awaited операция завершена.

public async Task FetchWebResponse(string url)
{
   var response = await SendRequest(url)
}

Ожидаемое значение должно быть Задачей, поскольку они идут рука об руку друг с другом. Когда вы звоните SendRequest() функция, она возвращает Task<T>, и программа ожидает завершения этой задачи. Вы можете думать о await как ключевое слово, используемое для возврата или ожидания завершения значения задачи.

Что такое задачи?

Задачи обертки, используемые для работы с асинхронными функциями. По сути, они представляют ценность, которая воля будут возвращены в будущем. Вы можете использовать await ключевое слово, чтобы дождаться результата, или получить к нему прямой доступ, проверив, Task.IsCompleted а затем считывая значение Task.Result.

Вы можете создать их, написав async функция с типом возврата Task<T>. Затем все, что вам нужно сделать, это вернуть значение типа T, и .NET интерпретирует это как возвращение задачи. Ты можешь использовать await внутри этой задачи ждать асинхронных операций, которые, в свою очередь, сами возвращают задачу.

Создайте задачу, написав асинхронную функцию с типом возврата Task<T>. » width=»663″ height=»220″ onload=»pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);» onerror=»this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);»/></p><p>Вы можете запустить задачу, используя <code>Task.Run(Action action)</code>.  Это поставит задачу в очередь на <em>пул потоков</em>, который будет работать в фоновом режиме в другом потоке.  Пул потоков принимает очередь задач и назначает их потокам ЦП для обработки.  По возвращении они помещаются в список выполненных задач, где можно получить доступ к их значениям.</p><div class='code-block code-block-3 ai-viewport-1' style='margin: 8px 0; clear: both;'><div id=

Пул потоков берет очередь задач и назначает их потокам ЦП для обработки.  После возврата они помещаются в завершенный список задач, где доступны их значения.

Однако, несмотря на то, что он находится в фоновом потоке, по-прежнему очень важно использовать async/await. Если вы делаете блокирующий вызов API в фоновом потоке и не await При этом .NET будет держать этот поток заблокированным до его завершения, заполняя пул потоков бесполезными потоками, ничего не делая, кроме как снижать производительность.

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

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

Вы также можете запускать и ожидать задачи внутри других Задач. Например, предположим, что у вас есть функция внутри задачи, DoExpensiveCalculation(), выполнение которого требует времени. Вместо того, чтобы обрабатывать его синхронно, вы можете написать его как задачу и поставить фоновый поток в очередь в начале основной задачи. Затем, когда вам понадобится значение из этого расчета, вы можете просто await задача, и она будет уступать, пока задача не будет завершена, и возвращаемое значение не будет возвращено.

Запускать и ожидать задачи внутри других Задач