[问题] 请教BackgroundWorker转Async Await?

楼主: 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?
作者: fo40225   2016-01-02 11:26:00
http://msdn.microsoft.com/zh-tw/library/hh160373.aspx或是用System.Threading.Timer做Timer timer = new Timer(t =>{//Do something here((Timer)t).Change(0, Timeout.Infinite);});timer.Change(0, Timeout.Infinite);不然就是回归传统用Thread 如果要换掉BackgroundWorker话
作者: Litfal (Litfal)   2016-01-02 14:49:00
既然要循环为什么不用无穷循环?另外Task有ContinueWith,还有你的需求乍看下不适合用await去取代
作者: fo40225   2016-01-02 15:09:00
单纯用无穷循环会卡死UI 所以他需要后台执行ContinueWith应该很难写成无穷 Task内无限循环比较合理
作者: Litfal (Litfal)   2016-01-02 15:12:00
...当然不可能单纯无穷循环阿...以他提供的资讯来看,用RunWorkerCompleted再启动就是ContinueWith阿
作者: fo40225   2016-01-02 15:13:00
await该Task即可 不然就是Thread内循环或Timer了
作者: Litfal (Litfal)   2016-01-02 15:13:00
无穷循环是一种写法,并没有说要在UI Thread上跑好吗...
作者: fo40225   2016-01-02 15:14:00
以文中的写法 ContinueWith 再启动同一件事不好写吧?是啊 原PO只要解决不在UI thread上跑无穷循环就行了
作者: Litfal (Litfal)   2016-01-02 15:15:00
await无穷循环的Task...?那await后面的东西永远不会跑...
作者: fo40225   2016-01-02 15:16:00
所以我贴的连结是有CancellationToken的
作者: Litfal (Litfal)   2016-01-02 15:17:00
对,所以我劈头第一句就问为什么不用无穷循环要用BackgroundWorker了,我猜他每次工作一次就要回传一些进度显示在UI上
作者: fo40225   2016-01-02 15:17:00
如果他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:00
Forms的Timer能用吧?我觉得你的需求最简单的解决方式是用Timer触发定时,去Call Query Method,如果Query不复杂甚至不用Async。耗时的话就把Query method写成Async版本

Links booklink

Contact Us: admin [ a t ] ucptt.com