Task.ContinueWith () гарантированно работает? - PullRequest
1 голос
/ 01 октября 2019

Предположим, у меня есть какая-то асинхронная задача, которая иногда может выполняться быстро, а иногда медленно,

public Random seed = new Random();
private async Task<string> _Work()
{
    int time = seed.Next(0, 5000);
    string result = string.Format("Worked for {0} milliseconds", time);
    await Task.Delay(time);
    return result;
}

public void SomeMethod()
{
    _Work(); // starts immediately? Am I right?

    // since _Work() will be executed immediately before ContinueWith() is executed,
    // will there be a chance that callback will not be called if _Work completes very quickly,
    // like before ContinueWith() can be scheduled?
    _Work().ContinueWith(callback)
}

Гарантируется ли обратный вызов в Task.ContinueWith () для выполнения в вышеуказанном сценарии?

1 Ответ

4 голосов
/ 01 октября 2019

будет ли вероятность того, что обратный вызов не будет вызван, если _Work завершится очень быстро?

Нет. Продолжения, переданные на ContinueWith, всегда будут запланированы. Если задача уже выполнена, они будут запланированы немедленно. Задача использует потокобезопасный вид «gate», чтобы гарантировать, что продолжение, переданное в ContinueWith, всегда будет запланировано;есть условие гонки (конечно), но оно правильно обрабатывается, поэтому продолжение всегда запланировано независимо от результатов гонки.

...