我有一项任务。我有一些随机数,包含这个数字的值和延迟。
延迟意味着在此延迟(以秒为单位)后,此数字将被更新(值和延迟)。
接下来我需要做的就是:例如我有5个数字。所有这些都是相同的形式。所以当程序启动时,它必须取第一个数字,得到它的延迟,像这个数字的Thread.Sleep(延迟)一样,更新它,然后得到第二个数字,得到延迟等等。当它到达最后一个时,它必须再次获得第一个数字,然后是第二个,依此类推。喜欢循环。
我是线程的新手。那么有人可以解释一下它应该如何运作?
所以我有主表单,然后我有5个UserControls(我将它们保存在List<>中)。每个控件都有UpdateNumber()方法,它更新当前数字的值和延迟。我应该在主表格上做什么?我需要创建Thread []数组吗?然后将每个UserControl放在那里?然后开始所有这些并以某种方式监控它们?
我认为它关于Thread.Join。但对我来说,至于新手,这很复杂。
P.S。而且我需要接下来的任务。它是一样的,但所有这些数字都很有效。例如,第一个数字在开始时有5秒的延迟。当它达到5秒延迟时,它会自动更新。第二个数字和所有其他数字相同。
答案 0 :(得分:2)
我会避免创建线程并使用Thread.Sleep()
。每个线程都是一个昂贵的资源来创建,因为它在大多数时间都会睡着,所以大部分时间都会浪费。此外,当它执行时,它可能导致上下文切换,因为CPU可能已饱和。
相反,我会考虑使用System.Threading.Timer
。例如,您最初将Timer
设置为对第一个值进行操作。完成此操作后,您可以使用“延迟”设置Timer
以执行将使用Timer.Change()
读取下一个值的代码,依此类推。我不确定我是否完全理解您的要求,但听起来您应该能够使用Timer
来满足大部分要求。 Timer
将使用ThreadPool
,这将避免不必要的线程创建和上下文切换。
要了解有关多线程的更多信息,我强烈推荐Jeffrey Richter的书籍CLR via C#(第五部分)。多线程功能非常强大,但完全错误却非常容易。恕我直言,任何想要编写多线程代码的人至少应该在开始之前阅读这样的好文本。
答案 1 :(得分:0)
仅基于我所阅读的内容,我看不出使用线程的任何令人信服的理由。我的意思是你只是根据一些时间间隔生成不同的随机数,因此它不可能是CPU密集型的。只需在每个System.Windows.Forms.Timer
中使用UserControl
即可。执行Tick
事件处理程序时,只需生成下一个数字。
如果您在询问在不同的主题中运行每个UserControl
是否是个好主意,那么答案肯定是否定的。包括Form
和Control
在内的所有UI元素都必须在特别指定的UI线程中运行。这是强制性的。它在自由线程上无法正确(或根本无法)正常工作。
关于致电Thread.Join
;不要尝试这个,至少在UI线程上是这样。在UI线程上调用Join
将阻止Windows消息调度机制。看起来好像整个用户界面都挂了。