在即发即忘的方法中等待

我注意到,当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);

    }

}

这永远不会超过这条线await EmailSenderAsync(to,body);,只会emails发送第一封电子邮件。EmailSenderAsync是外部代码,所以我无法进入它。添加一个等待SendAsync(emails)将使一切正常......但它不是火和忘记。


我认识到这可能不是针对这种特殊情况的最佳解决方案。我更想了解为什么会失败以及您可以使用什么模式async在火灾中创建功能并忘记按预期工作。


翻翻过去那场雪
浏览 123回答 2
2回答

Cats萌萌

前几天我遇到了类似的问题。我所做的是将我的await方法声明为任务,然后将它们传递给Task.WhenAll.试试这个:var taskEmailSendAsync = EmailSenderAsync(to, body);var taskDelay = Task.Delay(3000);await Task.WhenAll(taskEmailSenderAsync, taskDelay)
打开App,查看更多内容
随时随地看视频慕课网APP