У меня есть следующий код (да, я мог бы имитировать JavaScript setTimeout
API)Task.Delay (0) не асинхронный
async void setTimeout(dynamic callback, int timeout)
{
await Task.Delay(timeout);
callback();
}
Похоже на timeout > 0
, то setTimeout
работает асинхронно, в котором управление возвращается обратно к callee
по await
и callback
вызывается после выполнения задачи асинхронно. BUT, когда timeout == 0
, функция ведет себя синхронно (код всегда проходит мимо строки ожидания в том же потоке без контекстного переключателя). При дальнейшем копания, оказывается, что Task.Delay
осуществляется вести себя таким образом (Task.Yield() versus Task.Delay(0))
интересно, если есть способ сделать Task.Delay (0) асинхронно или альтернативное решение, чтобы сделать мою setTimeout
функцию асинхронно, когда timeout
является 0
? (, чтобы я мог имитировать JavaScriptsetTimeout
функциональность) Я вижу обсуждения об использовании Task.FromResult(true)
или Task.WhenAll
, но они, похоже, не работают.
Действительно, я могу использовать Task.Delay(1)
вместо Task.Delay(0)
, но он не выглядит органичным.
Что вы ищете, когда говорите, что ищете «контекстный переключатель»? –
Я не совсем уверен, чего вы пытаетесь достичь. Если вы задерживаете '0ms', вы не задерживаетесь. На самом деле, он не является ни синхронным, ни асинхронным, поскольку это, по сути, не-op. Существует буквально *** никакой работы ***, которая должна выполняться асинхронно, поэтому она немедленно возвращается. – Rob
Используйте 'Task.Yield'. Это опубликует продолжение, которое нужно обработать, однако TaskScheduler считает нужным, что демонстрирует это другое сообщение. Если вы хотите заставить новый поток использовать 'Task.Delay (timeout) .ConfigureAwait (false)'. –