Я пытаюсь познакомиться с ключевыми словами cue new/ожидания async, и я нашел несколько аспектов, которые я не могу понять.
-  
Начните с условий гонки:
Stream s=... ... for(int i=0;i<100;i++) { s.WriteAsync(new byte[]{i},0,1); }будет работать так, как ожидалось, все время (например, писать в файл 12345..... а не 13254 или что-то в этом роде)?
Во-вторых, функция async выполняется синхронно, если она не содержит оператора ожидания. И, согласно документации Microsoft, функции async всегда выполняются в потоке вызывающего (по сравнению с BeginInvoke). Это приводит меня к трем следующим вопросам:
 -  
Сколько из функции async выполняется до того, как оно будет выпущено в функцию вызывающего абонента?
async void MyAsyncFunction() { Operation1(); Operation2(); Operation3(); .... Stream s=...; await s.WriteAsync(....); }В статьях о await/async, которые я прочитал, он сказал, что асинхронные функции без ожидания выполняются последовательно, а с ожиданием async/await. Но он ворчит в меня, что
MyAsyncFunctionвсегда может выполнять Operation1... Operation3 перед выпуском, когда он достигаетawait s.WriteAsync. -  
Что делать, если я использую
Thread.Sleepв async-функции, например:async void DoStuff() { Stream s=...; ... await s.WriteAsync(....); Thread.Sleep(10000); .... }Будет ли Thread.Sleep блокировать весь поток, в котором он выполняется, или просто функция async?
 -  
Что делать, если я использую
semaphore.Wait()в одной из функций async, и ожидается, что семафор будет выпущен другой функцией async. Будет ли это вести себя так же, как с потоками, или это вызовет тупик? -  
awaitне работает вне функций async. Почему?