Это потому, что setTimeout
не возвращает обещание await
в вашей функции main
. Сам setTimeout выполняется синхронно. Он добавляет к циклу событий обратный вызов, который передается в качестве аргумента для выполнения в указанное время.
Также в этом коде возврат вашего обратного вызова ничего не значит, так как обратный вызов будет запущен в течение 1 секунды, и возвращаемое значение не будет никуда.
Ключевое слово async
говорит вам, что функции возвращают обещание и могут содержать await
код. Таким образом, поскольку в вашем коде нет ожидания, он выглядит как
function moveOneStepAsync() {
setTimeout(() => {
return console.log('Hello world!');
}, 1000);
return Promise.resolve();
}
. Таким образом, ваш await
в основном будет ожидать один тик цикла событий, чтобы перейти к следующему «шагу»
Читать о setTimeout, цикле событий и о том, что ожидает, чтобы понять его более подробно
Я провел тест для HeapFree
. Следующая программа имеет нарушение прав доступа внутри HeapFree
при i = 31999:
#include <windows.h>
int main() {
HANDLE heap = GetProcessHeap();
void * bufs[64000];
// populate heap
for (unsigned i = 0; i < _countof(bufs); ++i) {
bufs[i] = HeapAlloc(heap, 0, 4000);
}
// protect a block in the "middle"
DWORD dwOldProtect;
VirtualProtect(
bufs[_countof(bufs) / 2], 4000, PAGE_NOACCESS,
&dwOldProtect);
// free blocks
for (unsigned i = 0; i < _countof(bufs); ++i) {
HeapFree(heap, 0, bufs[i]);
}
}
Стек равен
ntdll.dll!_RtlpCoalesceFreeBlocks@16() + 0x12b9 bytes
ntdll.dll!_RtlFreeHeap@12() + 0x91f bytes
shutfree.exe!main() Line 19 C++
Таким образом, похоже, что ответ - «Да» (это относится к свободным
, поскольку ну, поскольку он использует HeapFree
внутри)
Если Вы чисто не освободите все свои ресурсы на завершении работы приложения, то оно сделает его почти на невозможном, чтобы обнаружить, если у Вас будут какие-либо действительно серьезные проблемы - как утечки памяти - который был бы большим количеством проблемы, чем медленное закрытие. Если UI исчезнет быстро, то пользователь будет думать, что это закрылось быстро, даже если это имеет большую работу все еще, чтобы сделать. С UI восприятие скорости более важно, чем действительная скорость. Когда пользователь выбирает опцию 'Exit Application', окно главного приложения должно сразу исчезнуть. Не имеет значения, если приложение займет несколько секунд после этого к свободному все выход корректно, то пользователь не заметит.
Я почти уверен, что ответ на вопрос об улучшении скорости был бы "да". Освобождение блока может или не может коснуться фактического рассматриваемого блока, но это должно будет, конечно, обновить другую бухгалтерскую информацию в любом случае. Если у Вас есть огромное количество маленьких выделенных объектов (это происходит), то усилие, требуемое освободить их всех, могло оказать значительное влияние.
Если можно расположить его, Вы могли бы попытаться настроить свое приложение, таким образом что, если это знает, что собирается выйти, сохранить любую незаконченную работу (конфигурация, документы, безотносительно) и выйти неизящно.