【发布时间】:2015-03-04 10:12:50
【问题描述】:
我有一个 GUI,只有 1 个后台线程(不断运行)。 GUI 必须能够告诉 bg 线程在其工作之间执行一些操作。就像 GUI 线程在空闲时可以工作一样。我知道正常线程不会空闲。不过我需要知道:这里有哪些可能性?
当你有一个控件时,切换到一个 GUI 线程很简单:
if (InvokeRequired)
this.Invoke(new Action<string>(thisMethod), new object[] { text });
else
{
// ...
}
现在 - 当用户点击一个按钮时 - 我如何在后台线程上执行一个方法已经在运行?通过后台线程,我指的是这些人:
new Thread(new ThreadStart(MyThread.Run)).Start();ThreadPool.QueueUserWorkItem(o => { MyThread.Run(); });
我对这两个都感兴趣:Invoke 和 BeginInvoke 样式。
感谢您的帮助!
【问题讨论】:
-
Task.Run( () => { }) -
你几乎不应该使用
new Thread。坚持使用线程池,创建线程非常昂贵。 -
除非目标线程合作,否则不可能在特定线程上运行代码。它必须解决producer-consumer problem。其通用解决方案是线程安全队列和从该队列检索调用请求的调度程序循环。也许这开始听起来很熟悉,是的,这就是 GUI 线程的操作方式。当然在.NET 中得到很好的支持。你喜欢 BeginInvoke(),你might as well use it。
标签: c# multithreading winforms invoke