C # async await: как мне написать асинхронный метод для моего примера, показанного ниже? - PullRequest
1 голос
/ 17 октября 2019

Вот фрагмент кода, и я получаю предупреждение:

в этом асинхронном методе отсутствуют операторы ожидания и он будет работать синхронно. Подумайте об использовании оператора await для ожидания неблокирующих вызовов.

    public async Task<ActionResult> CreateRequest([FromBody] DnsRecordDto RecordRequested)
    {
        var result = IsRecordRequestedNull()
    }

    public bool IsRecordRequestedNull(DnsRecordDto RecordRequested)
    {
        bool flag = false;
        if (RecordRequested == null)
        {
            flag = true;
            _commonRepository.SaveLogItem(Constants.TransactionFailedBadData, Constants.STARTING, transId, LogLevel.Trace);
        }
        return flag;
    }

Я не уверен, как обратиться к этому предупреждению

Действительно ли мне нужно декорировать IsRecordRequestedNull асинхроннымключевое слово и заставить его работать асинхронно только потому, что я вызываю этот метод из асинхронного метода?

В таких случаях я должен игнорировать появившееся предупреждение ..?

Ответы [ 2 ]

10 голосов
/ 17 октября 2019

Использование ключевого слова async само по себе не делает метод запущенным асинхронно. Он просто позволяет использовать оператор await. Если вы не используете await, не используйте async.

В предупреждении просто говорится: «Вы не используете await, так почему вы используете async

Если вы не используете или не можете использовать await, то исправление заключается в удалении ключевого слова async:

public ActionResult CreateRequest([FromBody] DnsRecordDto RecordRequested)
{
    var result = IsRecordRequestedNull()
}

Если существует асинхронная версияэтот SaveLogItem метод (SaveLogItemAsync может быть?), тогда вы можете подождать его и сделать все async:

public async Task<ActionResult> CreateRequest([FromBody] DnsRecordDto RecordRequested)
{
    var result = await IsRecordRequestedNull()
}

public async Task<bool> IsRecordRequestedNull(DnsRecordDto RecordRequested)
{
    bool flag = false;
    if (RecordRequested == null)
    {
        flag = true;
        await _commonRepository.SaveLogItemAsync(Constants.TransactionFailedBadData, Constants.STARTING, transId, LogLevel.Trace);
    }
    return flag;
}

Но я не знаю, откуда взялся этот SaveLogItem метод,поэтому я не могу сказать, доступна ли вам асинхронная версия.

Если это метод, который вы написали сами и хотите, чтобы он работал асинхронно, тогда вам нужно начать. Посмотрите, где он выполняет какие-либо операции ввода-вывода (чтение / запись файлов, выполнение сетевых запросов и т. Д.), И измените его на использование async версий этих вызовов (обычно с суффиксом «Async») и ожидайте их. Затем вы можете изменить этот метод и любые методы, которые его вызывают, на async.

. У Microsoft есть серия очень хорошо написанных статей об асинхронном программировании, которые вы могли бы извлечь из чтения: Асинхронное программирование сасинхронно и жду

1 голос
/ 17 октября 2019

Ваш метод снабжен ключевым словом async , которое подразумевает, что вы хотите выполнить свой код асинхронно, но ключевое слово async само по себе ничего не делает, вы должны ждут где-нибудь в теле вашего метода. поэтому, как предложил @Gabriel Luci, проверьте, есть ли асинхронная версия SaveLogItem, чтобы вы могли await . если нет, просто удалите async , и все будет в порядке.

...