TPL ActionBlock使用疑问:停止按钮触发Complete是否合理?
关于TPL ActionBlock调用Complete的合理时机分析
- 你在停止按钮的点击方法里调用
ActionBlock.Complete()是完全合理的,这才是贴合你业务场景的正确时机!
ActionBlock的Complete()方法核心作用就是通知块停止接收新输入,同时等待已入队的任务全部执行完毕。你的需求是:用户点击停止后,禁止新输入+等待现有任务完成再关闭UI——这和Complete()的设计意图完美匹配,完全没问题。
反过来,如果在ActionBlock的构造函数里就调用Complete(),那这个块刚创建就直接“罢工”了,根本没法处理任何用户输入的任务,完全违背了你用它做后台并行处理的初衷,绝对不可取。
另外给你个小优化建议:你现在用_jobs.Completion.Wait()是同步等待,在UI线程里这么做容易导致界面卡死。建议改成异步等待的方式,把方法调整成这样:
public async Task CheckJobQ() { _jobs.Complete(); await _jobs.Completion; }
然后在停止按钮的点击事件里用await CheckJobQ(),这样UI线程不会被阻塞,用户体验会更流畅。
总结一下,停止按钮的独立方法是调用Complete()的最佳时机,既符合业务逻辑,也契合ActionBlock的设计理念。构造函数里调用完全是错误的时机,会直接让你的ActionBlock失去作用。
内容的提问来源于stack exchange,提问作者SonuRamaKrishna
相关产品推荐
相关产品推荐

