c#从各处更新LED组件

本文关键字:LED 组件 更新 | 更新日期: 2023-09-27 18:24:19

我有一个与简单任务有关的问题:更新命名空间中任何类的控制状态。详细地说,我已经编写了一个GUI,它从列表框中打开不同的表单(每行打开一个不同的表单)。在某些情况下,调用的表单必须从SQL数据库中检索数据,在这种情况下,我想插入几个自定义控件(LED),以便在系统检索数据(红色LED)或准备就绪(绿色LED)时向用户发出信号。

基本上,结果是我无法在表单加载过程中更新这些控件,我注意到一个好的方法可以是后台工作人员,但不确定它是否正确。

你知道如何管理它吗?

c#从各处更新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及更高版本的更新主题)。