Почему методы без await исполняются последовательно?

Методы без оператора await в C# исполняются последовательно из-за специфики работы потоков и выполнения асинхронных операций.

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

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

Оператор await позволяет сделать метод асинхронным и позволяет другим методам продолжить свое выполнение, пока асинхронная операция не завершится. Если не использовать await, метод будет выполнен синхронно и любые методы, вызванные после него, будут выполняться только после его завершения.

Например, рассмотрим следующий код:

public async Task MyMethod()
{
    await LongRunningOperation();
    OtherCode();
}

public async Task LongRunningOperation()
{
    // Операции, занимающие длительное время
}

В этом примере метод MyMethod является асинхронным и вызывает метод LongRunningOperation, который также является асинхронным. Благодаря оператору await, выполнение метода MyMethod приостанавливается до завершения LongRunningOperation. После завершения LongRunningOperation, выполнение возобновляется и код следующий за оператором await (OtherCode()) будет выполнен.

Однако, если мы изменим код и уберем оператор await:

public async Task MyMethod()
{
    LongRunningOperation();
    OtherCode();
}

public async Task LongRunningOperation()
{
    // Операции, занимающие длительное время
}

В этом случае метод MyMethod все равно будет асинхронным (так как имеет возвращаемый тип Task или Task<T>), но LongRunningOperation будет вызываться синхронно, и выполнение кода метода MyMethod не будет приостановлено до завершения LongRunningOperation. Вместо этого, OtherCode будет выполнен сразу же после вызова LongRunningOperation.

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