如何从 gui 线程更改为后台线程?

How do I change from gui thread to a background thread?

我有一个 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-style。

感谢您的帮助!

你可以使用

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

创建一个由后台线程查看的队列。 如果队列中有对象,则为该对象执行工作,否则执行(部分)它自己的工作。

让 GUI 线程将工作放入队列。

确保队列是线程安全的