Вот простая функция, которая объясняет использование:
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
Это потому, что
var response = emailHandler.SendEmail(apiKey, senderEmail, senderName, recipientEmail, recipientName, subject, content, html);
инициирует задачу, а ваш вызывающий объект (публичный статический объект SendEmail) не ожидает этой задачи.
Крис Пратт написал хороший блог с асинхронным помощником для запуска синхронизации асинхронных методов.
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
знаний.
Мне кажется, вы ожидаете, что 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;
}