@neroforse

Почему не работает данный пример с async await?

class Program
{
    static void Main(string[] args)
    {
        Task<int> t = Run();
        Console.WriteLine("Main");
        Console.ReadLine();
    }

    static async Task<int> Run()
    {
        Console.WriteLine("Hello from begining \"Run\" method");
        int num = 1000000000;
        long res = await new TaskFactory().StartNew(() => { return SumZeroToNum(num); });
        Console.WriteLine($"Result: {res}");
    }

    static long SumZeroToNum(int num)
    {
        long result = 0;
        for (int i = 0; i < num; i++)
        {
            result += i;
        }
        return result;
    }
}

При попытке скомпилировать этот код, студия выдает ошибку CS0161 для метода Run: not all code paths return a value.
В моем понимании после создания таски, управление возвращается методу Main, т.е. возвращается Task. Тогда почему же возникает ошибка?
  • Вопрос задан
  • 464 просмотра
Решения вопроса 1
@lvv85
Исправьте метод Run
static async Task Run()
    {
        Console.WriteLine("Hello from begining \"Run\" method");
        int num = 1000000000;
        long res = await new TaskFactory().StartNew(() => { return SumZeroToNum(num); });
        Console.WriteLine($"Result: {res}");
    }


и строку вызова этого метода:
Task t = Run();
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@kttotto
пофиг на чем писать
У Вас здесь несколько ошибок.

Во первых, Вы в сигнатуре метода Run()указали, что он возвращает объект типа Task, но return не сделали. Если Вы хотите, чтобы он возвращал таску, то ее надо создать
var task = new Task(() => async
{ 
	Console.WriteLine("Hello from begining \"Run\" method");
    int num = 1000000000;
    long res = await new TaskFactory().StartNew(() => { return SumZeroToNum(num); });
    Console.WriteLine($"Result: {res}");
});

а потом вернуть
return task;

Но сделав в методе Main Run(), Вы только получите объет задачи, автоматом он у Вас не выполнится. Для этого Вам нужно будет сделать t.Start();
Если хотите, чтоб вызывать метод можно было через async, то внутри надо сделать так

return Task.Run(() =>
{
    ....
})

Тогда запустить его можно будет асинхронно
await Run();
Или синхронно
Run().Result;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы