Итак, у меня есть следующее:
if (await Task.WhenAny(myLongRunningTask, Task.Delay(9000)) != myLongRunnnigTask && !myLongRunningTask.IsFaulted)
{
Console.WriteLine("TimedOut");
}
else
{
Console.WriteLine("Completed");
}
Кажется, работает нормально, когда я завершу свою задачу; но если я никогда не завершу долгосрочную задачу, то это просто зависает, а не по истечении 9 секунд. Даже поставить ошибочный тест, чтобы быть уверенным.
(ПРИМЕЧАНИЕ. Реальный код делает больше, чем просто запись в командной строке; но он никогда даже не попадает в сферу; хотя я тоже пробовал писать только в командной строке ... без изменений.)
Тем не менее, делать то, что мне кажется, в LinqPad точно так же:
async void Main()
{
var Other = Task.Factory.StartNew(() => { Thread.Sleep(15000); });
if(await Task.WhenAny(Other, Task.Delay(4000)) != Other && !Other.IsFaulted) "TimedOut".Dump();
else "Completed".Dump();
Other = Task.Factory.StartNew(() => { Thread.Sleep(1000); });
if(await Task.WhenAny(Other, Task.Delay(4000)) != Other && !Other.IsFaulted) "TimedOut".Dump();
else "Completed".Dump();
}
К счастью, пишет TimedOut, а затем Completed.
Первый раздел кода глубоко в довольно большом модуле. Но я не понимаю, что может побочно повлиять на это странное поведение ... Чего мне не хватает?
ПРИМЕЧАНИЕ по принятому ответу:
Вопрос здесь заключался в том, что может быть побочным эффектом. Ответ @Douglas 'указывает на побочный эффект, который повлиял на мой код. Это не обязательно решает проблему; просто говорит вам, где ваша проблема. Однако он услужливо добавил комментарий со ссылкой на статью, которая действительно поможет вам исправить это.