繁体   English   中英

如何从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。

谢谢您的帮助!

创建一个由后台线程窥视的队列。 如果队列中有一个对象,请为该对象执行工作,否则执行其一部分工作。

让GUI线程进入工作队列。

确保队列是线程安全的

你可以用

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();

在这种情况下,您可以轻松地重用后台工作者

您甚至可以根据需要向其中添加队列使用Queue创建BackgroundWorker

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM