作者akafair (VAIO)
看板C_Sharp
标题[问题] 请教BackgroundWorker转Async Await?
时间Sat Jan 2 10:22:44 2016
请教一下版上前辈, 小弟有件旧方案使用BackgroundWorker,
打算用Async-Await搭Task的方式重写.
目前遇到一个问题就是, 原本的写法会在RunWorkerCompleted
的最後再去呼叫一次RunWorkerAsync触发DoWork, 在背景一直循环.
如果要用Async-Await-Task的写法, 要怎麽达到同样的效果?
我现在是把整个流程包成一个Method用按键Click去触发, 如果我用
回圈类的架构去包, 又会变成UI freeze..
不知道有没有对应RunWorkerAsync及RunWorkerCompleted的Method?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.36.78.139
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1451701366.A.A05.html
2F:→ fo40225: 或是用System.Threading.Timer做 01/02 11:29
3F:→ fo40225: Timer timer = new Timer(t => 01/02 11:29
4F:→ fo40225: { 01/02 11:29
5F:→ fo40225: //Do something here 01/02 11:29
6F:→ fo40225: ((Timer)t).Change(0, Timeout.Infinite); 01/02 11:30
7F:→ fo40225: }); 01/02 11:30
8F:→ fo40225: timer.Change(0, Timeout.Infinite); 01/02 11:30
9F:→ fo40225: 不然就是回归传统用Thread 如果要换掉BackgroundWorker话 01/02 11:31
10F:→ Litfal: 既然要循环为什麽不用无穷回圈? 01/02 14:49
11F:→ Litfal: 另外Task有ContinueWith,还有你的需求乍看下不适合用 01/02 14:51
12F:→ Litfal: await去取代 01/02 14:52
13F:→ fo40225: 单纯用无穷回圈会卡死UI 所以他需要後台执行 01/02 15:09
14F:→ fo40225: ContinueWith应该很难写成无穷 Task内无限回圈比较合理 01/02 15:10
15F:→ Litfal: ...当然不可能单纯无穷回圈阿...以他提供的资讯来看,用 01/02 15:12
16F:→ Litfal: RunWorkerCompleted再启动就是ContinueWith阿 01/02 15:12
17F:→ fo40225: await该Task即可 不然就是Thread内回圈或Timer了 01/02 15:13
18F:→ Litfal: 无穷回圈是一种写法,并没有说要在UI Thread上跑好吗... 01/02 15:13
19F:→ fo40225: 以文中的写法 ContinueWith 再启动同一件事不好写吧? 01/02 15:14
20F:→ fo40225: 是啊 原PO只要解决不在UI thread上跑无穷回圈就行了 01/02 15:15
21F:→ Litfal: await无穷回圈的Task...?那await後面的东西永远不会跑... 01/02 15:15
22F:→ fo40225: 所以我贴的连结是有CancellationToken的 01/02 15:16
23F:→ Litfal: 对,所以我劈头第一句就问为什麽不用无穷回圈要用 01/02 15:17
24F:→ Litfal: BackgroundWorker了,我猜他每次工作一次就要回传一些进度 01/02 15:17
25F:→ Litfal: 显示在UI上 01/02 15:17
26F:→ fo40225: 如果他Cancel了 就会回await了 01/02 15:17
27F:→ fo40225: 嗯 这也有可能 01/02 15:18
28F:→ fo40225: 如果还是要Task内回圈 实作IProgress是好主意吗? 01/02 15:22
29F:→ Litfal: 先看看原PO为什麽要用BackgroundWorker吧 01/02 15:38
30F:→ akafair: 两位先进请恕小弟没有讲明白, 实际的Task是一个Query远端 01/02 19:02
31F:→ akafair: SQL资料库并转换成报表到UI的动作, 每隔半小时触发一次 01/02 19:04
32F:→ akafair: 原本timer是写在BgWorker的complete里面 01/02 19:06
33F:→ akafair: 因为这是在公司用的code, 有点敏感不方便贴, 不好意思. 01/02 19:07
34F:→ akafair: task.continue with也是目前考虑的方向. Task内无穷回圈 01/02 19:18
35F:→ akafair: 的写法因为有牵扯到回传UI, 实际运行会UI freeze? 01/02 19:20
36F:→ akafair: 总之,感谢两位的回覆. 我会重写那段方法再试, 现在是co的 01/02 19:23
37F:→ Litfal: 你想换掉原有BgWorker的原因是? 01/02 20:45
38F:→ akafair: 因为我们新专案都用Async了, 为了align新人的SOP. 01/02 20:49
39F:→ Litfal: Forms的Timer能用吧?我觉得你的需求最简单的解决方式是 01/02 20:50
40F:→ Litfal: 用Timer触发定时,去Call Query Method,如果Query不复杂 01/02 20:51
41F:→ Litfal: 甚至不用Async。耗时的话就把Query method写成Async版本 01/02 20:53