Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在火中等待,忘记方法_C#_Asynchronous_Async Await - Fatal编程技术网

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效果,因此这没有帮助