我注意到当await
位于我正在触发的方法中并忘记应用时,只会使其达到await
那么它会像点击{return
一样{1}}。在我目前正在查看的简化版本中,您可能有:
public void DoTheThing() {
...
Task fireAndForget = SendAsync(emails);
}
public async Task SendAsync(List<Email> emails) {
foreach (var email in emails) {
var to = email.to;
var body = email.body;
await EmailSenderAsync(to,body);
await Task.Delay(3000);
}
}
这绝不会超过await EmailSenderAsync(to,body);
行,只会发送emails
中的第一封电子邮件。 EmailSenderAsync
是外部代码,所以我无法介入它。添加await到SendAsync(emails)
将使一切正常......但是它不会发生火灾而忘记。
我认识到这可能不是针对这种特殊情况的最佳解决方案。我更希望了解为什么会失败以及你可以使用什么模式在火中制造async
函数并忘记按预期工作。
答案 0 :(得分:1)
前几天我遇到了类似的问题。我所做的是将我的await
方法声明为任务,然后将其传递给Task.WhenAll
。
试试这个:
var taskEmailSendAsync = EmailSenderAsync(to, body);
var taskDelay = Task.Delay(3000);
await Task.WhenAll(taskEmailSenderAsync, taskDelay)
答案 1 :(得分:-1)
像Camilo提到的那样,控件正在回归你的父母。确保你的父母仍然存在这样的事情:
var parentContext = Task.Run(() => DoTheThing() );
parentContext .Wait();