Асинхронное против синхронного выполнения, что это действительно означает?

Уже вчера я нашел пользователя с аналогичной проблемой: WPF - Измените содержимое кнопки в стиле?

Это сообщение привлекло меня к этому soloution (не удалось опубликовать это из-за 8-часового предела stackoverflow -.-)


    
        
            
        
    

Не знаю, погода это более чистая / грязная / лучше, чем растворение HB

1070
задан nisarg parekh 23 September 2018 в 17:09
поделиться

6 ответов

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

При этом в контексте компьютеров это означает выполнение процесса или задачи в другом «потоке». Поток - это серия команд (блок кода), которая существует как единица работы. Операционная система может управлять несколькими потоками и назначать потоку часть («кусочек») процессорного времени перед переключением на другой поток, чтобы дать ему возможность выполнить некоторую работу. По своей сути (простите за каламбур) процессор может просто выполнить команду, он не имеет понятия о том, чтобы делать две вещи одновременно. Операционная система имитирует это, выделяя отрезки времени различным потокам.

Теперь если вы введете в процесс несколько ядер / процессоров, то МОЖЕТ произойти одновременно. Операционная система может выделять время одному потоку на первом процессоре, а затем выделять такой же блок времени другому потоку на другом процессоре. Все это позволяет операционной системе управлять выполнением вашей задачи, в то время как вы можете продолжать выполнять код и заниматься другими делами.

Асинхронное программирование - сложная тема из-за семантики того, как все связывается, когда вы можете делай их одновременно. Есть множество статей и книг на эту тему; посмотри!

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

Асинхронное программирование - сложная тема из-за семантики того, как все связывается, когда вы можете делать их одновременно. Есть множество статей и книг на эту тему; посмотри!

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

Асинхронное программирование - сложная тема из-за семантики того, как все связывается, когда вы можете делать их одновременно. Есть множество статей и книг на эту тему; посмотри!

1681
ответ дан 19 December 2019 в 20:15
поделиться

Проще говоря, асинхронное выполнение делает вещи в фоновом режиме.

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

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

23
ответ дан 19 December 2019 в 20:15
поделиться

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

Маленький пример:

Предположим, что воспроизведение аудио включает три шага:

  1. Получение сжатой песни с жесткого диска
  2. Распаковка аудио.
  3. Воспроизведение несжатого аудио.

Если ваш аудиоплеер выполняет шаг 1,2,3 последовательно для каждой песни, то это синхронно. Вам придется подождать некоторое время, чтобы услышать песню, пока песня действительно не будет извлечена и распакована.

Если ваш аудиоплеер выполняет шаги 1,2,3 независимо друг от друга, то он асинхронный. то есть. Во время воспроизведения аудио 1 (шаг 3), если он извлекает аудио 3 с жесткого диска параллельно (шаг 1) и распаковывает аудио 2 параллельно. (шаг 2 ) В итоге вы услышите песню, не дожидаясь извлечения и распаковки.

33
ответ дан 19 December 2019 в 20:15
поделиться

Синхронный означает, что вызывающая сторона ожидает ответа или завершения, асинхронная, что вызывающая сторона продолжается, и ответ приходит позже (если применимо).

В качестве примера :

    static void Main(string[] args)
    {
        Console.WriteLine("Before call");
        doSomething();
        Console.WriteLine("After call");
    }

    private static void doSomething()
    {
        Console.WriteLine("In call");
    }

Это всегда будет выводиться:

Before call
In call
After call

Но если бы мы делали doSomething асинхронным (несколько способов сделать это), то вывод мог бы стать:

Before call
After call
In call

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

54
ответ дан 19 December 2019 в 20:15
поделиться

Синхронное выполнение означает, что выполнение происходит в одной серии. A-> B-> C-> D . Если вы вызываете эти подпрограммы, A запустится, затем завершится, затем начнется B , затем закончится, затем запустится C и т. Д.

С помощью асинхронного выполнения вы начинаете процедуру и позволяете ей выполняться в фоновом режиме, пока вы начинаете следующую, а затем в какой-то момент произнесите «дождитесь завершения». Это больше похоже на:

Start A-> B-> C-> D -> Подождите , пока A не закончится

Преимущество состоит в том, что вы можете выполнить B , C и или D , пока A еще работает (в фоновом режиме, в отдельном потоке),

88
ответ дан 19 December 2019 в 20:15
поделиться

Синхронный / Асинхронный НИЧЕГО НЕ СДЕЛАТЬ С МНОГООБРАЗУЮЩИМ.

Синхронный или Синхронизированный означает «связанный» или «зависимый» в некотором роде. Другими словами, две синхронные задачи должны быть осведомлены друг о друге, и одна задача должна выполняться каким-либо образом, зависящим от другой, например ждать, пока не выполнится другая задача.
Асинхронный означает, что они полностью независимы, и ни один из них не должен учитывать другого каким-либо образом, ни при инициации, ни при исполнении.

Синхронный (один поток):

1 thread ->   |<---A---->||<----B---------->||<------C----->|

Синхронный (многопоточный):

thread A -> |<---A---->|   
                        \  
thread B ------------>   ->|<----B---------->|   
                                              \   
thread C ---------------------------------->   ->|<------C----->| 

Асинхронный (один поток):

         A-Start ------------------------------------------ A-End   
           | B-Start -----------------------------------------|--- B-End   
           |    |      C-Start ------------------- C-End      |      |   
           |    |       |                           |         |      |
           V    V       V                           V         V      V      
1 thread->|<-A-|<--B---|<-C-|-A-|-C-|--A--|-B-|--C-->|---A---->|--B-->| 

Асинхронный (многопоточный):

 thread A ->     |<---A---->|
 thread B ----->     |<----B---------->| 
 thread C --------->     |<------C--------->|
  • Начальная и конечная точки задач A, B , C представлен <, > символов.
  • Срезы ЦП представлены вертикальными полосами |

Технически, концепция синхронного / асинхронного действительно не имеет ничего общего с потоками . Хотя, в общем, необычно находить асинхронные задачи, выполняющиеся в одном потоке, возможно (см. Ниже примеры), и часто встречается , чтобы найти две или более задач, выполняющихся синхронно в отдельные темы ... Нет, понятие синхронного / асинхронного связано с исключительно с тем, может ли вторая или последующая задача быть инициирована до завершения другой (первой) задачи, или же она должна ждать. Это все. Какой поток (или потоки), или процессы, или процессоры, или действительно, на каком оборудовании выполняются задачи, не имеет значения. Действительно, чтобы подчеркнуть это, я отредактировал графику, чтобы показать это.

АСИНХРОННЫЙ ПРИМЕР. При решении многих инженерных задач программное обеспечение предназначено для разделения общей проблемы на несколько отдельных задач, а затем выполнять их асинхронно. Хорошими примерами являются инвертирование матрицы или проблема анализа методом конечных элементов. В вычислениях сортировка списка является примером. Например, процедура быстрой сортировки разбивает список на два списка и сортирует каждый из них, вызывая себя рекурсивно. В обоих приведенных выше примерах две задачи могут (и часто выполняются) выполняться асинхронно. Они не должны быть в отдельных потоках. Даже машина с одним ЦП и только одним потоком выполнения может быть закодирована, чтобы инициировать обработку второй задачи до завершения первой. Единственным критерием является то, что результаты одной задачи не являются необходимыми в качестве входных данных для другой задачи . Пока время начала и окончания задач перекрываются (возможно только в том случае, если выходные данные одного из них необходимы в качестве входных данных для другого), они выполняются асинхронно, независимо от того, сколько потоков используется.

СИНХРОННЫЙ ПРИМЕР. Любой процесс, состоящий из нескольких задач, где задачи должны выполняться последовательно, но одна должна выполняться на другом компьютере (выборка и / или обновление данных, получение котировки акций из финансовой службы и т. Д.). Если оно'

1103
ответ дан 19 December 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: