我有一个GUI,只有一个后台线程(不断运行)。 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-style。
感谢您的帮助!
答案 0 :(得分:3)
创建一个由后台线程查看的队列。 如果队列中有一个对象,那么该对象的工作是否会(自己的一部分)完成它自己的工作。
让GUI线程在队列中运行。
确保队列是线程安全的
答案 1 :(得分:1)
您可以使用
public void test()
{
ThreadPool.QueueUserWorkItem(_ => Background("test"));
}
或者你可以使用
public void test()
{
Parallel.Invoke(() => Background("test"));
}
或者像这样
public void test()
{
BackgroundDelegate c = new BackgroundMethodDelegate(Background);
IAsyncResult a = c.BeginInvoke("test", null, null);
c.EndInvoke(a);
}
或者像这样
public void test()
{
Thread thread = new Thread(_ => Background("test"));
thread.Start();
thread.Join();
}
有很多不同的方法可以做到这一点
编辑:
最简单的方法是使用后台工作程序
var bw = new BackgroundWorker();
bw.DoWork += (worker, args) => {
Background("test");
};
bw.RunWorkerAsync();
在这种情况下,您可以轻松地重复使用后台工作程序
如果需要,您甚至可以为其添加队列 Creating BackgroundWorker with Queue