楼主:
akafair (VAIO)
2016-01-02 10:22:44请教一下版上前辈, 小弟有件旧方案使用BackgroundWorker,
打算用Async-Await搭Task的方式重写.
目前遇到一个问题就是, 原本的写法会在RunWorkerCompleted
的最后再去呼叫一次RunWorkerAsync触发DoWork, 在背景一直循环.
如果要用Async-Await-Task的写法, 要怎么达到同样的效果?
我现在是把整个流程包成一个Method用按键Click去触发, 如果我用
循环类的架构去包, 又会变成UI freeze..
不知道有没有对应RunWorkerAsync及RunWorkerCompleted的Method?
作者:
Litfal (Litfal)
2016-01-02 14:49:00既然要循环为什么不用无穷循环?另外Task有ContinueWith,还有你的需求乍看下不适合用await去取代
单纯用无穷循环会卡死UI 所以他需要后台执行ContinueWith应该很难写成无穷 Task内无限循环比较合理
作者:
Litfal (Litfal)
2016-01-02 15:12:00...当然不可能单纯无穷循环阿...以他提供的资讯来看,用RunWorkerCompleted再启动就是ContinueWith阿
await该Task即可 不然就是Thread内循环或Timer了
作者:
Litfal (Litfal)
2016-01-02 15:13:00无穷循环是一种写法,并没有说要在UI Thread上跑好吗...
以文中的写法 ContinueWith 再启动同一件事不好写吧?是啊 原PO只要解决不在UI thread上跑无穷循环就行了
作者:
Litfal (Litfal)
2016-01-02 15:15:00await无穷循环的Task...?那await后面的东西永远不会跑...
所以我贴的连结是有CancellationToken的
作者:
Litfal (Litfal)
2016-01-02 15:17:00对,所以我劈头第一句就问为什么不用无穷循环要用BackgroundWorker了,我猜他每次工作一次就要回传一些进度显示在UI上
如果他Cancel了 就会回await了嗯 这也有可能如果还是要Task内循环 实作IProgress是好主意吗?
作者:
Litfal (Litfal)
2016-01-02 15:38:00先看看原PO为什么要用BackgroundWorker吧
楼主: akafair (VAIO) 2016-01-02 19:02:00
两位先进请恕小弟没有讲明白, 实际的Task是一个Query远端SQL数据库并转换成报表到UI的动作, 每隔半小时触发一次原本timer是写在BgWorker的complete里面因为这是在公司用的code, 有点敏感不方便贴, 不好意思.task.continue with也是目前考虑的方向. Task内无穷循环的写法因为有牵扯到回传UI, 实际运行会UI freeze?总之,感谢两位的回复. 我会重写那段方法再试, 现在是co的
作者:
Litfal (Litfal)
2016-01-02 20:45:00你想换掉原有BgWorker的原因是?
楼主: akafair (VAIO) 2016-01-02 20:49:00
因为我们新专案都用Async了, 为了align新人的SOP.
作者:
Litfal (Litfal)
2016-01-02 20:50:00Forms的Timer能用吧?我觉得你的需求最简单的解决方式是用Timer触发定时,去Call Query Method,如果Query不复杂甚至不用Async。耗时的话就把Query method写成Async版本