Task.Wait (int) начинает ждать правильно, когда он вызывается или когда запускается задача? - PullRequest
0 голосов
/ 27 февраля 2019

Это довольно тонкий вопрос, но мое любопытство одолело меня, и я не смог найти ответ в документах или где-либо еще на SO.

Документы для Task.Wait(int millisecondsTimeout) скажем:

Ожидает завершения задания в течение указанного количества миллисекунд.

Возвращает:

true, если Задача завершила выполнение в отведенное время;в противном случае, false.

Рассмотрим этот фрагмент:

Task task = Task.Run(() => {
    Thread.Sleep(2000);
});
task.Wait(1000);

Отсчет времени ожидания начинается сразу же, когда я звоню Task.Wait(...), или Wait(...) сначала ждетЗадача запустить на самом деле, прежде чем начать отсчет?(Task.Run(...) только делает задачу пригодной для выполнения. Она не гарантирует, что она действительно запущена)

Например, если все потоки в пуле потоков используются, и пул потоков должен задержаться наскажем, за 0,5 секунды до создания нового потока для моей поставленной в очередь задачи, мой Wait(1000) вызов вернется через целую секунду или через 0,5 секунды?

Если бы я догадался, я бы сказал, что Wait(...) вернется через целую секунду, но я хочу убедиться.

1 Ответ

0 голосов
/ 27 февраля 2019

Поскольку, по моим прочтениям, вам было бы достаточно легко проверить сценарий, чтобы выяснить это для себя, я не совсем уверен, что на самом деле понимаю, о чем вы спрашиваете.Тем не менее, вот как I проверит это:

static void Main(string[] args)
{
    Task task = new Task(() => WriteLine("task!"));

    task.Wait(1000);

    WriteLine("Done waiting");
}

И, конечно же, если вы запустите приведенный выше код, вы обнаружите, что даже если вы никогда не запускали задачувызов Wait() все равно истечет через 1 секунду.

Другими словами, как сказано в документации, метод ожидает до времени, указанного для завершения задачи, а затем возвращается.

Учитывая, что метод Wait() вернется, даже если задача даже не была запущена, он также вернется, если задача была запущена, но у нее еще не было возможности выполнить какой-либо код.Похоже, что на самом деле это тот сценарий, о котором вы спрашивали.

Независимо от того, запускается задача или нет, это не имеет значения (хотя на практике у нас почти никогда не бывает незапущенных задач… хорошие идиоматические практики программирования на C # диктуют, что вы получаете толькоTask объект из механизмов, которые возвращают уже запущенную задачу, например Task.Run() или вызов метода async).

Или посмотрите на это так: если ваша мама говорит вам: «ЯВы подадите ужин, как только вы закончите убирать свою комнату, но не позднее, чем через 30 минут ", как вы думаете, она примет во внимание, действительно ли вы начали убирать вашу комнату илине?Нет, она собирается подать ужин через 30 минут, несмотря ни на что.

То же самое с .NET.Неважно, запустили ли вы задачу или нет, просто она не была выполнена за отведенное время.

...