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

时间:2015-03-04 10:12:51

标签: c# multithreading winforms invoke

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

感谢您的帮助!

2 个答案:

答案 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