[英]Updating UI from background thread - how do I know that my GUI is not disposed?
[英]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.