C# 在火中等待,忘记方法
我注意到,当C# 在火中等待,忘记方法,c#,asynchronous,async-await,C#,Asynchronous,Async Await,我注意到,当await在我正在启动的方法中,而忘记了该应用程序时,该应用程序只会到达await的范围,然后它会像点击return一样。在我目前看到的简化版本中,您可能有: public void DoTheThing() { ... Task fireAndForget = SendAsync(emails); } public async Task SendAsync(List<Email> emails) { foreach (var email in
await
在我正在启动的方法中,而忘记了该应用程序时,该应用程序只会到达await
的范围,然后它会像点击return
一样。在我目前看到的简化版本中,您可能有:
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);
}
}
public void DoTheThing(){
...
任务fireAndForget=SendAsync(电子邮件);
}
公共异步任务SendAsync(列出电子邮件){
foreach(电子邮件中的var电子邮件){
var to=email.to;
var body=email.body;
等待EmailSenderAsync(收件人,正文);
等待任务。延迟(3000);
}
}
这将永远不会超过行wait EmailSenderAsync(to,body)
并且只会发送电子邮件
中的第一封电子邮件EmailSenderAsync
是外部代码,因此我无法进入它。向SendAsync(电子邮件)
添加等待将使一切正常。。。但是,这也不是“火与忘”的问题
我认识到这可能不是针对这种特殊情况的最佳解决方案。我更希望了解这一点失败的原因,以及您可以使用什么模式在fire中实现
异步
功能,然后忘记预期的工作。就像Camilo提到的那样,控件正在返回到您的父级。确保你的父母仍然在那里,比如:
var parentContext = Task.Run(() => DoTheThing() );
parentContext .Wait();
前几天我也有类似的问题。我所做的是将我的
等待
方法声明为任务,然后将它们传递给任务
试试这个:
var taskEmailSendAsync = EmailSenderAsync(to, body);
var taskDelay = Task.Delay(3000);
await Task.WhenAll(taskEmailSenderAsync, taskDelay)
你真的看到了这种行为吗?或者这是你从调试中收集到的吗?@CamiloTerevinto,它真的被看到了。“emails”中的第一封电子邮件将实际到达,并且任务上有一个断点。延迟永远不会命中。断点永远不会命中,因为控件返回给父级。所以,毫无疑问here@CamiloTerevinto问题是,您如何使其按预期运行?i、 e.实际迭代foreach。尝试使SendAsync
void
而不是Task
。另外,该EmailSenderAsync
是否会抛出一个由于未等待而看不到的异常?这会消除fire and forget效果,因此这没有帮助