Я пытаюсь познакомиться с ключевыми словами 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. Почему?