Прежде всего:
Task<int> t = new Task<int>(GetValue); // The program hangs here.
неверно, программа фактически висит здесь:
Console.WriteLine(x.Result);
.Result
блокирует текущий поток, пока задача x не завершит выполнение и не вернет результат. Он никогда не завершается, поскольку он ожидает задачу, возвращаемую методом CalculateValue
с этой задачей:
Task<int> t = new Task<int>(GetValue);
Это так называемое «холодное задание», которое означает, что это задание в неактивном состоянии.
Чтобы запустить «горячую» задачу (что в основном означает запуск задача), используйте метод Task.Run
:
Task<int> t = Task.Run(GetValue);