it-swarm.com.ru

асинхронное ожидание возврата задачи

Может кто-нибудь объяснить, что это значит в синхронном методе? Если я попытаюсь изменить метод на async, тогда VS пожалуется на это.

Это работает:

public Task MethodName()
{
     return Task.FromResult<object>(null);
}

Это не работает:

public async Task MethodName()
{
     return Task.FromResult<object>(null);
}

В общем, я хотел бы знать, что именно это означает: Task.FromResult<object>(null);

102
David Dury

Методы async отличаются от обычных методов. Все, что вы возвращаете из методов async, заключено в Task.

Если вы не вернете никакого значения (void), оно будет заключено в Task, если вы вернете int, оно будет заключено в Task<int> и так далее.

Если ваш асинхронный метод должен возвращать int, вы должны пометить возвращаемый тип метода как Task<int>, и вы вернете простое int, а не Task<int>. Компилятор преобразует int в Task<int> для вас.

private async Task<int> MethodName()
{
    await SomethingAsync();
    return 42;//Note we return int not Task<int> and that compiles
}

Так же, когда вы возвращаете Task<object>, тип возвращаемого вами метода должен быть Task<Task<object>>

public async Task<Task<object>> MethodName()
{
     return Task.FromResult<object>(null);//This will compile
}

Поскольку ваш метод возвращает Task, он не должен возвращать никакого значения. Иначе это не скомпилируется.

public async Task MethodName()
{
     return;//This should work but return is redundant and also method is useless.
}

Имейте в виду, что асинхронный метод без оператора await не является async.

171
Sriram Sakthivel

Вам нужно использовать ключевое слово await, когда используете async, и тип возвращаемой функции должен быть универсальным. Вот пример с возвращаемым значением:

public async Task<object> MethodName()
{
    return await Task.FromResult<object>(null);
}

Вот пример без возвращаемого значения:

public async Task MethodName()
{
    await Task.CompletedTask;
}

Прочитайте это:

TPL: http://msdn.Microsoft.com/en-us/library/dd460717 (v = vs.110) .aspx и задачи: http://msdn.Microsoft. ком/EN-US/библиотека/system.threading.tasks (v = vs.110) .aspx

Async: http://msdn.Microsoft.com/en-us/library/hh156513.aspx Ожидайте: http://msdn.Microsoft.com/en-us/library/ hh156528.aspx

38
Major

Добавление ключевого слова async является просто синтаксическим сахаром для упрощения создания конечного автомата. По сути, компилятор берет ваш код;

public async Task MethodName()
{
     return null;
}

И превращает это в;

public Task MethodName()
{
     return Task.FromResult<object>(null);
}

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

Когда эта задача завершится, ваша задача будет выполнена снова. Поэтому некоторый дополнительный код добавляется в начало метода, чтобы восстановить состояние переменных и перейти к следующей части вашего кода.

Смотрите Что генерирует async & await? для примера.

Этот процесс имеет много общего с тем, как компилятор обрабатывает методы итератора с помощью операторов yield.

21
Jeremy Lakeman
    public static async Task<string> MyTask()
    {
        //C# anonymous AsyncTask
        return await Task.FromResult<string>(((Func<string>)(() =>
        {
            // your code here
            return  "string result here";

        }))());
    }
2
Adel Mourad