Понимание шаблона C# «async / await» от Java разработчика - PullRequest
3 голосов
/ 18 января 2020

Я из среды разработки Java и начал кодировать в C#. Я заметил шаблон 'async / await' в C#, который я никогда не видел в Java. Что именно? Некоторое время я просматривал inte rnet и не могу найти определенного объяснения, которое бы разъяснило мое понимание того, что это такое.

Итак, давайте определим следующий сценарий:

Поток 'T' (например, GUI thread) выполняет GUI асинхронную c функцию 'F' В какой-то момент в этой асинхронной c функции 'F' мы вызываем ' await »на« ожидаемом »объекте« A »(скорее всего, Task / Task <>). Затем вызов 'await' освобождает / возвращает (но не приостанавливает) выполнение потока 'T' (в данном случае поток GUI) для запуска / выполнения некоторой другой Задачи. (s) пока «ожидающий» «А» выполняет свою работу. Когда объект 'Aaitable' 'A' завершает свою работу, выполнение асинхронной c функции 'F' возобновляется. В приведенном выше сценарии (если я описал это правильно), какой поток будет выполнять «ожидаемый» метод «A»? - поток GUI или какой-либо другой поток из пула ?. Если это поток пула (а не поток GUI), и я обращаюсь к ресурсам GUI этого метода (например, кнопки, метки, представление сетки и т. Д. c), я собираюсь испортить данные потока GUI? Помните, что я из мира Java, где существует только один поток GUI, который может изменять / манипулировать ресурсами GUI.

Ответы [ 3 ]

2 голосов
/ 18 января 2020

в первую очередь все оба синтаксиса различаются.

Синтаксис потока: -

Thread thread = new Thread(() => VoidMethod("","",""));

thread.Start();

https://www.c-sharpcorner.com/blogs/asynchronous-multithreaded-programming-with-example-in-c-sharp

, если вы используете это поток не возвращает никакого значения. пока весь запрос завершен.

Task / Task <> Синтаксис: -

public async Task<int> VoidMethod("","","")
{
   await Task.Run(() => VoidMethod("","",""));
   return 1; 
}

https://www.c-sharpcorner.com/article/async-and-await-in-c-sharp/

, если вы используете этот метод, возвращает значение , пока весь запрос завершен.

0 голосов
/ 19 января 2020

Лучшее место для начала - документы:

Асинхронное программирование с использованием asyn c и ожидание

Чем любое сообщение в блоге Стивен Туб или Стивен Клири .

0 голосов
/ 19 января 2020

await() может вызвать возврат из асинхронного метода c, но его выполнение не завершено, он будет вызван снова через некоторое время. Чтобы быть вызванным позже, он попадает в строку с некоторым событием перед возвратом, так же, как поток может вызвать Object.wait() в Java, что означает, что поток попадает в строку к какому-либо событию и покидает процессор. Метод Asyn c покидает поток, поскольку поток играет для него роль процессора.

, когда происходит событие, метод asyn c возобновляется, то есть он просто вызывается снова в следующем доступном потоке пула потоков - точно так же, как поток после того, как wait () запускается на следующем доступном процессоре. Чтобы продолжить выполнение не с самого начала, а с последнего места, откуда оно вернулось из-за await(), информация о состоянии сохраняется и затем используется в виде: switch(state) { case 0: goto 0'; case 1: goto 10'; .... }

Обратите внимание, что это байт-код, поэтому можно использовать goto. Чтобы сохранить состояние, нам нужно поле объекта, поэтому метод asyn c на самом деле является не методом, а классом, который создается в том месте, где он вызывается впервые.

Из-за прямое использование goto, трудно или иногда невозможно закодировать asyn c метод простым C# или Java. Но всегда можно закодировать каждую часть метода asyn c как отдельный метод и использовать эти методы в качестве обратных вызовов для ожидаемых событий. Async / await - это просто еще один синтаксис для асинхронного программирования, наряду с обратными вызовами, актерами, ComplatableFuture, java .util.concurrent.Flow et c.

...