c# – 触发并忘记异步任务方法有时不会调用
我有一个异步方法:
public async Task DoSomethingAsync(){ ... await ... await ... .... return await SaveAsync(); } 在大多数时候,我通过以下方式调用此方法: await DoSomethingAsync() 此调用按预期工作.但在某个地方,我需要将此方法称为火,并忘记: public void OtherMethod() { ... DoSomethingAsync(); //fire and forget here } 在这种情况下,有时Task DoSomethingAsync()会运行并完成,但有时任务永远不会被调用(或在DoSomethingAsync()中调用一些等待但永远不会完成最后一次等待SaveAsync();). 我正在尝试通过以下代码确保以火灾和忘记方式调用任务: public void OtherMethod() { ... Task.Factory.StartNew(() => { await DoSomethingAsync(); }); //fire and forget again here } 但是,这不符合预期.所以我的问题是: >如何在没有等待的情况下调用DoSomethingAsync()将始终运行并完成? (我不关心AppDomain重启/崩溃的情况) 解决方法
等待应该工作正常,所以这里可能还有其他东西正在等待你的一个或多个方法.有几种可能性:
>你的某个方法中有某个死锁,阻止它完成并阻止等待恢复. 如果您可以使用VS调试器附加并观察发生的情况,请尝试暂停并查看Parallel Stacks视图.这应该有助于缩小考虑的可能性. 正如斯蒂芬指出的那样,当你称之为“即发即忘”时,也可能发生异常.如果您还没有,请确保您处理TaskScheduler.UnobservedTaskException以记录此类事件.请注意,这是从终结器调用的,因此调用它的时间是不确定的.这可能会使调试变得棘手,因为事件可能要比导致异常的实际事件晚得多.因此,我建议遵循Stephen的建议并将任务保存到等待或稍后等待其他地方. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- SQLite研究——性能优化
- c – 你怎么能断言所有std :: vector都是一行中给定的大小?
- ruby-on-rails – 在rails中直接编写SQL查询是一个好习惯吗
- 指针和循环在C
- Swift 学习笔记 [2] 类 结构体 枚举
- flash – 带有Brightcove的HTML5视频
- Swift – 使用drawInRect绘制文本:withAttributes:
- iOS应用程序提交 – 存档不包含info.plist
- azure – 无法使用VS publish从VS2015发布node.js应用程序
- Yup错误: TypeError: Cannot read property 'object&#