c#从各处更新LED组件
本文关键字:LED 组件 更新 | 更新日期: 2023-09-27 18:24:19
我有一个与简单任务有关的问题:更新命名空间中任何类的控制状态。详细地说,我已经编写了一个GUI,它从列表框中打开不同的表单(每行打开一个不同的表单)。在某些情况下,调用的表单必须从SQL数据库中检索数据,在这种情况下,我想插入几个自定义控件(LED),以便在系统检索数据(红色LED)或准备就绪(绿色LED)时向用户发出信号。
基本上,结果是我无法在表单加载过程中更新这些控件,我注意到一个好的方法可以是后台工作人员,但不确定它是否正确。
你知道如何管理它吗?
是的,您需要使用BackgroundWorker
或其他异步操作。如果您在FormLoad
期间执行逻辑,这是一个同步操作,那么无论怎样,您都不会在表单中看到任何更新。
因此,例如,对于后台工作人员:
BackgroundWorker bw;
private void Form1_Load(object sender, EventArgs e)
{
bw = new BackgroundWorker();
bw.WorkerReportsProgress = true; //allows call backs
bw.DoWork += bw_DoWork;
bw.ProgressChanged += bw_ProgressChanged;
bw.RunWorkerAsync(); //run the worker
}
void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
var message = e.UserState;
//do something with the UserState on the UI, like flash a light
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker localBW = (BackgroundWorker)sender;
//do your logic here, when you want to "report progress"
//use the following lines
localBW.ReportProgress(0, "hey, flash please"); // or something else
//when you are all done, you can pass something back
e.Result = "I'm done now";
}
有关更多阅读,请参阅BackgroundWorker上的msdn页面,使用BackgroundWorkers的"如何:",以及使用Async和Await的异步编程(.net 4.0及更高版本的更新主题)。