The C# language specification says this:
3.10 Execution Order
Execution of a C# program proceeds such that the side effects of each
executing thread are preserved at critical execution points. A side
effect is defined as a read or write of a volatile field, a write to a
non-volatile variable, a write to an external resource, and the
throwing of an exception. The critical execution points at which the
order of these side effects must be preserved are references to
volatile fields (§10.5.3), lock statements (§8.12), and thread
creation and termination. The execution environment is free to change
the order of execution of a C# program, subject to the following
constraints:
- Data dependence is preserved within a thread of execution. That is, the value of each variable is computed as if all statements in the
thread were executed in original program order.
- Initialization ordering rules are preserved (§10.5.4 and §10.5.5).
- The ordering of side effects is preserved with respect to volatile reads and writes (§10.5.3). Additionally, the execution environment
need not evaluate part of an expression if it can deduce that that
expression’s value is not used and that no needed side effects are
produced (including any caused by calling a method or accessing a
volatile field). When program execution is interrupted by an
asynchronous event (such as an exception thrown by another thread), it
is not guaranteed that the observable side effects are visible in the
original program order.
So I take this to mean that if the compiler or jitter can prove that your two function calls can be re-ordered, or even skipped, then the compiler is free to do so. In practice I believe that the compiler or jitter will not perform an optimisation like that on your code, and that your function calls will execute synchronously. On top of that the CPU is perfectly free to re-order execution for optimisation reasons, and will do so. Of course, it won't re-order execution in a way that changes the observable output.
In any case it is somewhat moot because whenever a language specification or CPU architecture allows re-ordering, it is only allowed if it makes no difference to the meaning of your program. So, you cannot come to any harm by having a mental model that says that statements are executed synchronously and in order. If the compiler and/or CPU chooses to re-order it will do so in a way that won't affect the outcome of your program.