Re: [问题] Thread被咬住如何解决?

楼主: singledream (鱼大头)   2015-07-30 23:42:16
Hi,
最近工作上有点忙,我也怕我写的对一开始不熟TPL的人会有点困扰。
一开始有比较常上来看您有没有遇到问题,后来较忙就忽略了!
针对您的问题如下:
1.1.
为何要await一个Task.Run()?因为主绪(UI thread)并不知道此thread何时结束。
若省略掉await你会发现主绪会直接结束。因此我们加上await来等待此一动作结束,
那么为何在一个匿名委派也要用async/await?那是因为Task.Delay必须搭配await做
使用的关系。其实省略掉async/await,变成一个Thread.Sleep代替也可以。但是await
Task.Run()是不能忽略的。原因如上所叙。
1.2.
Lamba语法方面可能要请您多找找例子便会了解它的方便之处。
2.
因为你无法在一个背景执行绪里面做更新UI的动作,必须此UI的绪自己做更新。
上面也有版友介绍的Invoke/BeginInvoke也是把更新UI这段请UI的绪自己做处理。
3.
你拔掉这段的话,其实就是一直在频繁更新UI不是吗?我自己拔掉是会令UI有卡住
的现象。通常我们去做频繁更新UI(while loop)这样的形式,最好还是隔一段时间。
为什么?因为主绪可能还有别的事情要处理,但你若占住主绪的所有排程,会发生很多
无法预期的事情。
我想出点功课给你:你使用一个timer去做更新UI的事件。不过在此时你去让主绪(UI)
做一个简单的counting的while loop看看会发生什么事情?
请把你的心得分享给板友们看看,相信你会在此中领悟到一些我想传递给你的想法。
以上是我的分享,若不嫌弃都欢迎来信与我讨论。我所分享有可能并不完全正确,
若有误欢迎指出指导我,谢谢。
楼主: singledream (鱼大头)   2015-07-31 00:39:00
Lamba->Lambda, 错字修正。
作者: nfsong (圖書館我來了)   2015-08-10 14:39:00
作者: uranusjr (←這人是超級笨蛋)   2015-08-10 17:30:00
Lamba->Laoda ,错字修正。 (欸

Links booklink

Contact Us: admin [ a t ] ucptt.com