如何从 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 线程将工作放入队列。
确保队列是线程安全的
我有一个 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 线程将工作放入队列。
确保队列是线程安全的