Приложение зависает при выполнении асинхронной задачи - PullRequest
0 голосов
/ 06 мая 2018

Я изучаю async / await и создал фиктивное консольное приложение. Когда я пытаюсь получить результат от асинхронного метода, программа просто зависает. Любая идея, что не так в следующем коде.

static void Main(string[] args)
{
    var task = Task.Factory.StartNew(() => 5);

    var x = TestAsync();
    //x.Start();
    Console.WriteLine(x.Result);
}

private static Task<int> CalculateValue()
{
        Console.WriteLine("In CalculateValue"); // This line is printed.
        Task<int> t = new Task<int>(GetValue); // The program hangs here.
        return t;
}

public static async Task<int> TestAsync()
{
        int result = await CalculateValue();
        return result;
}

private static int GetValue()
    {
        return 10;
    }

1 Ответ

0 голосов
/ 06 мая 2018

Прежде всего:

    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);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...