All
Я использую веб-формы asp.net, asp.net 4.7.2.
ПРИМЕЧАНИЕ. Страница помечена как
Async="true"
Я создал пользовательский элемент управления, в котором есть событие (в моем примере: событие ProcessOrder). Когда пользовательский элемент управления пытается вызвать событие
this.ProcessOrder?.Invoke(this, args);
Я сразу получаю это исключение:
System.InvalidOperationException: 'Асинхронная операция не может быть запущена в это время. Асинхронные операции могут быть запущены только внутри асинхронного обработчика или модуля или во время определенных событий в жизненном цикле страницы. Если это исключение произошло во время выполнения страницы, убедитесь, что страница помечена как <% @ Page Async = "true"%>. Это исключение может также указывать на попытку вызова метода «async void», который обычно не поддерживается при обработке запроса ASP.NET. Вместо этого асинхронный метод должен возвращать задачу, а вызывающая сторона должна ожидать ее. '
Подпись метода обработчика событий на странице:
protected async void PaymentOptions_ProcessOrder(object sender, PaymentOptions.ProcessOrderEventArgs e)
и выполняет эту строку:
await _SubmitOrderAsync(e.PaymentToken, e.PaymentTokenDescriptor);
который в свою очередь выполняет мой метод отправки асинхронной электронной почты
await this.CheckoutServices.TrySendOrderConfirmationEmailAsync(receipt);
Как я уже говорил, я пометил страницу как асинхронную и следовал протоколу для асинхронных методов, не зная, в чем проблема.
UPDATE:
Я внес небольшое изменение в код, удалил ключевое слово async из обработчика событий PaymentOptions_ProcessOrder и поэтому больше не жду метода _SubmitOrderAync () (что нормально, поскольку после него нет кода). Но в методе SubmitOrderAsync ()
private async void _SubmitOrderAsync(string paymentToken, string paymentTokenDescriptor)
Я жду TrySendOrderConfirmationEmailAsync ()
await this.CheckoutServices.TrySendOrderConfirmationEmailAsync(receipt);
Теперь, когда я запускаю этот код, он взрывается с тем же исключением, когда вызывается _SubmitOrderAsync () (в основном это ошибка в первом методе, украшенном ключевым словом async). Теперь я не уверен, что у меня есть все ожидающие методы, которые возвращают задачу, за исключением _SubmitOrderAsync (), которого я больше не ожидаю.
ОБНОВЛЕНИЕ 2
ОК, для дальнейшего устранения этой проблемы я создал фиктивную кнопку на той же странице и создал для нее асинхронный обработчик события onclick
protected async void btnGO_Click(object sender, EventArgs e)
Я поместил свой асинхронный метод TrySendOrderConfirmationEmailAsync (), который я пытаюсь запустить, и он работает!
В чем разница между тем, как вызывается обработчик событий нажатия кнопки по сравнению с обработчиком событий моего пользовательского элемента управления ???? Опять же, я использую эту строку для вызова моего обработчика событий в пользовательском элементе управления:
this.ProcessOrder?.Invoke(this, args);
Должен ли я использовать другую строку?