从backgroundworker说起如何顺应屎山

backgroundworker,轻量级异步调用,有经验的人都会告诉你不要在backgroundworker里调用UI,然而屎山不以个人意志而转移,去年我就不幸接手了一套建立在backgroundworker框架下的UI模块,由于业务要求,要在这个基础之上调用另两个窗口,对UI的处理根本没用progresschanged,而是自行构建了一套freshprogress,最后将所有相关代码逻辑收缩到最初的backgroundwork.ondowork之中提供唯一函数作为入口调用,和form.invoke才解决backgroundworker叠加之下调用UI的问题。

最近需要在之前成的代码中新增一条分支逻辑,其实也没什么难点,因为我之前的代码已经将需要调用UI的分支调教成近似单线程了,按老代码复制粘贴就行,结果run起来出现了冲突,新分支秒执行,最开始我想到了lock(locker),结果当内部逻辑不需要invoke UI的时候反而会被挂起,于是我回溯整个新业务的逻辑,发现新业务没有通过加入第一层backgroundworker的执行队列,所以相当于新业务和backgroundworker会同时进入这个唯一函数,造成线程冲突,我不得不把之前的逻辑加入到屎山的执行队列。

目前算是告一段落,虽然之前秒执行的分支现在反而经常被挂起,但终归能顺利执行,我估计是因为backgroundworker.dowork优先级太低的原因。

posted @ 2022-03-17 00:36  シシヌ  阅读(42)  评论(0编辑  收藏  举报