Patrick Skelton Ответов: 2

Как я могу сразу же вернуть результат из задачи


В базовом классе я пытаюсь создать реализацию по умолчанию для возвращаемой функции Task<string> Я могу решить, как это сделать " долго-но я не могу отделаться от мысли, что есть более аккуратный способ написать это.

Это моя текущая версия:

protected virtual async Task<string> MyFunction()
{
    await Task.Delay( 0 );
    return "";
}


Что я уже пробовал:

Я подумал, что смогу использовать его. TaskCompletionSource или Task.FromResult() но, похоже, не в состоянии разработать синтаксис для них. При использовании последнего я не могу обойти сообщение, которое говорит мне, что я должен вернуть a string не Task<string>.

2 Ответов

Рейтинг:
5

#realJSOP

Вы можете просто вернуться String.Empty не делая этого await Конечно, это сделало бы метод синхронным (потому что его нет await заявление), но я не вижу в этом ничего плохого, если это просто реализация по умолчанию.


Patrick Skelton

Разве это не означает, что вы навсегда застряли с предупреждением компилятора, говорящим Вам, что задача будет выполнена синхронно?

#realJSOP

Нет, если вы отключите это предупреждение для этого метода:

#pragma warning disable CS1633,CS1998
публичная асинхронная задача<string>....
{
}
#pragma warning restore CS1633,CS1998

Patrick Skelton

Не люблю отключать предупреждения (поскольку в моем случае предупреждение обычно правильное, и мой мозг находится в нейтральном состоянии), но спасибо за ответ.

#realJSOP

Вы можете сделать это только с помощью оскорбительного метода (я проиллюстрировал свой ответ). Конечно, вы можете поместить await в метод и покончить с ним.

#realJSOP

И, язык дает вам #pramga директива как раз для таких ситуаций. Я тоже не пользуюсь ими без крайней необходимости. В этом случае это ничего не делающая реализация метода по умолчанию. Это ничего не повредит...

#realJSOP

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

Рейтинг:
19

Richard Deeming

Простое - просто удалить async ключевое слово:

protected virtual Task<string> MyFunction()
{
    return Task.FromResult(string.Empty);
}
Если ваша задача выполняется синхронно большую часть времени, вы можете рассмотреть возможность использования ValueTask вместо.

Понимание того, почему, что и когда ValueTask | .Сетевой блог[^]


Patrick Skelton

Я вообще не знал о ValueTask, так что я узнал две вещи! - Спасибо, Ричард.

#realJSOP

Да, это и есть ответ. Мой подход не очень хорошо наследуется. Вообще. :)