Async & amp; await всегда возвращает & ldquo; Ожидание завершения & rdquo;

Вот простая функция, которая объясняет использование:

def print_wrap(arg1, *args, **kwargs):
    print(arg1)
    print(args)
    print(kwargs)
    print(arg1, *args, **kwargs)

Любые аргументы, которые не , указанные в определении функции, будут помещены в список args , или kwargs, в зависимости от того, являются ли они аргументами ключевого слова или нет:

>>> print_wrap('one', 'two', 'three', end='blah', sep='--')
one
('two', 'three')
{'end': 'blah', 'sep': '--'}
one--two--threeblah

Если вы добавите аргумент ключевого слова, который никогда не будет передан функции, будет поднята ошибка:

>>> print_wrap('blah', dead_arg='anything')
TypeError: 'dead_arg' is an invalid keyword argument for this function
0
задан Uwe Keim 22 February 2019 в 09:07
поделиться

3 ответа

Это потому, что

var response =  emailHandler.SendEmail(apiKey, senderEmail, senderName, recipientEmail, recipientName, subject, content, html);

инициирует задачу, а ваш вызывающий объект (публичный статический объект SendEmail) не ожидает этой задачи.

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

0
ответ дан BerDev 22 February 2019 в 09:07
поделиться

async-await - это просто ключевые слова, которые говорят компилятору компилировать ваш код как реализацию IAsyncStateMachine, а также ждут его завершения, оба эти слова должны использоваться совместно, чтобы они работали, и они работают только Task объекты. Task представляет часть работы, которая происходит.

Вы должны пометить свой метод SendEmail как async, изменить тип возвращаемого значения на Task<object> и await свой вызов emailHandler.SendEmail.

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

public static async Task<object> SendEmail(string apiKey, string senderEmail, string senderName, string recipientEmail, string recipientName, string subject, string content, bool html)
{
    EmailHandler emailHandler = new EmailHandler();
    var response = await emailHandler.SendEmail(apiKey, senderEmail, senderName, recipientEmail, recipientName, subject, content, html);

    return response;
}

Как всегда, Стивен Клири является отличным источником для async знаний.

0
ответ дан ColinM 22 February 2019 в 09:07
поделиться

Мне кажется, вы ожидаете, что SendEmail будет синхронным. Вы можете дождаться завершения асинхронного метода в SendEmail следующим образом:

public static Response SendEmail(string apiKey, string senderEmail, string senderName, string recipientEmail, string recipientName, string subject, string content, bool html)
{
    EmailHandler emailHandler = new EmailHandler();
    var responseTask =  emailHandler.SendEmail(apiKey, senderEmail, senderName, recipientEmail, recipientName, subject, content, html);
    responseTask.Wait(); // Wait for the task to complete

    return responseTask.Result;
}
0
ответ дан Hans Kilian 22 February 2019 в 09:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: