等待一种即发即弃的方法

时间:2018-05-24 22:59:54

标签: c# asynchronous async-await

我注意到当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函数并忘记按预期工作。

2 个答案:

答案 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();