Я пытаюсь понять async
- await
на глубоком уровне. Всякий раз, когда я вижу примеры того, как это работает, в примере используется способ await
, который можно использовать как LongRunningTask
или аналогичный, и в нем Task.Delay
или new WebClient().Download("http://google.com")
или что-то подобное. Я пытаюсь понять, что будет строгое определение того, что следует ожидать. Это не может быть просто «долговременной задачей», поскольку долговременная задача может быть чем-то вроде поиска максимального подмассива массива размером 1 000 000 000, что не принесло бы никакой пользы от эффективности, если бы это было await
ed, если это true, что async
- await
не создает новые темы.Что такое строгое определение того, что должно быть «ожидаемой» задачей?
Из того, что я понимаю, если у вас есть что-то вроде
var task = LongRunningTask();
DoSomething();
int x = DoSomethingElse();
int y = await task;
int z = x + y;
то куска
DoSomething();
int x = DoSomethingElse();
является то, что вы намекаете на компилятор, который
«Эй, компилятор, если вы можете проверить, что этот кусок не имеет никаких зависимостей от
LongRunningTask
и вице -верса, тогда вы можете начать , разделив вашу работу междуLongRunningTask
и этим фрагментом кода. Это вы еще не закончилиLongRunningTask
к тому времени, как вы закончите этот кусок кода, а затем просто работать на добиванииLongRunningTask
, поэтому почему я говорю вамawait
это.»
Можете ли вы помочь выпрямить меня ?
Асинхронных/Await был добавлен в 4.5, чтобы дать программист, которые предназначаются для WinRT (ака UWP, иначе Modern UI , aka Store, aka Phone) шанс для написания правильного кода. У этого есть * очень * строгое определение, все, что может занять более 50 миллисекунд. Вероятно, вы можете быть немного более избирательным, чем * что-либо *, а 50 мсек - довольно драконов, я лично использую 1 секунду как «слишком длинный» предел и, если это разумно, будет бросать курсор песочных часов. Избежать слива маленькой батареи - совсем другое соображение, тогда она становится драконовкой. –