Я очень новичок в этой концепции async/await, поэтому я прошу прощения за то, что я прояснил.Async и ждут синхронного метода, используя Task
Мне нужно отправить электронное письмо, и новый API потребует от меня использовать async и ждать. Проблема в том, что многие мои методы должны называть это «отправить электронную почту» синхронно.
Итак, я создаю синхронный метод обертку:
private Task SendEmailAsync(string email, string content)
{
...
...
...
}
private void SendEmail(string email, string content)
{
Task tsk = Task.Factory.StartNew(async() => await SendEmailAsync(email, content));
try { tsk.Wait(); }
catch (AggregateException aex)
{
throw aex.Flatten();
}
}
Но по какой-то причине, tsk.Wait() не ждет AWAIT SendEmailAsync (...) закончить. Итак, мне нужно добавить ManualResetEvent
. Что-то вроде этого
private void SendEmail(string email, string content)
{
ManualResetEvent mre = new ManualResetEvent(false);
Task tsk = Task.Factory.StartNew(async() =>
{
mre.Reset();
try { await SendEmailAsync(email, content); }
finally { mre.Set(); }
});
mre.WaitOne();
try { tsk.Wait(); }
catch (AggregateException aex)
{
throw aex.Flatten();
}
}
Но каких-либо исключений, брошенной SendEmailAsync (...) НЕ будет захвачен tsk.Wait(). Мой вопрос:
- Почему tsk.Wait() не ждет ждать SendEmailAsync (...)
- Как поймать исключение брошенный ждут SendEmailAsync (...)
Спасибо!
Просто позвоните 'SendEmailAsync (электронная почта, содержание) .GetAwaiter() GetResult();.' –
Для запуска кода асинхронной в синхронизации таким образом, смотрите здесь http://stackoverflow.com/a/5097066/5062791 – ColinM
вы не должны «делать» синхронизировать через async », поскольку он имеет тенденцию вызывать взаимоблокировки! Стивен Клири скоро будет здесь, чтобы указать это ;-), но если вам действительно нужно, я могу порекомендовать AsyncPump от Stephen Toub (https://blogs.msdn.microsoft.com/pfxteam/2012/01/20/await -synchronizationcontext-и-консольных приложений /). Но это не должно использоваться «внутри» вашей библиотеки. – ChrFin