我对定时器和线程有疑问。我注意到定时器在线程内启动时行为不端,而定时器是Winform的一部分。
一般来说,我对与线程和计时器相关的问题感兴趣。
祝大家新年快乐,答案可能要等到2011年:)答案 0 :(得分:1)
听起来您正在使用System.Threading.Timer
并使用执行GUI更新的TimerCallback
。是吗?
有许多正确的方法可以解决这个问题。如果您要更新UI,请使用System.Windows.Forms.Timer
并处理其Tick
事件。使用BackgroundWorker
,在其DoWork
事件中执行非UI工作,然后在执行长时间运行的后台任务时在其RunWorkerCompleted
事件中执行UI更新。
一般来说,了解与Windows窗体相关的多线程是一件重要的事情:所有Windows窗体应用程序都有一个UI线程,它是允许执行UI更新的唯一线程。它不断处理推送用户操作并通过事件处理的队列。当您尝试从此线程以外的任何线程执行更新UI控件的任何操作时,您会收到异常,因为在Windows窗体组件的设计中没有计划此行为,因此很可能导致错误或可能导致整个应用程序崩溃
因此,多线程的方法通常是将工作分为两部分,可以在后台(在非UI线程上)完成,以及必须发送到由UI线程处理的队列的部分,以便它可以安全地处理。像System.Windows.Forms.Timer
和BackgroundWorker
这样的类型的用处在于它们为您封装了这个过程的许多困难细节,使您可以专注于您想要运行的代码。
这是多线程如何与Windows窗体一起使用的高级视图。我相信其他人可以提供大量的参考资料,为您提供有关该主题的更多信息(如果没有其他人这样做,也许我可以稍后查看)。
答案 1 :(得分:1)
答案 2 :(得分:0)