我是C#的新手,所以我还在学习很多东西。
在表格上,我尝试将LED的图像从一种颜色更改为另一种颜色,然后更改回来
我希望进程异步运行,这样它就不会阻塞调用它的主线程。到目前为止,没有发生任何更改,我不确定为什么它不工作。
我创建了这样的任务
public async Task ChangeCallLed()
{
await Task.Run(() =>
{
this.Invoke((MethodInvoker)delegate
{
Globals.mForm.sndPageCall_lbl.Image = Resources.led_green_black;
Globals.mForm.sndPageCall_lbl.Update();
});
Thread.Sleep(1000);
this.Invoke((MethodInvoker)delegate
{
Globals.mForm.sndPageCall_lbl.Image = Resources.led_blue_black;
Globals.mForm.sndPageCall_lbl.Update();
});
Thread.Sleep(1000);
this.Invoke((MethodInvoker)delegate
{
Globals.mForm.sndPageCall_lbl.Image = Resources.led_amber_black;
Globals.mForm.sndPageCall_lbl.Update();
});
});
}
我在主线程中多次调用该任务,如下所示
编辑:全局变量:
static class Globals {
public static MainForm mForm;
public static PagerCall pCall;
}
Edit:main方法调用:
static void Main() {
ApplicationConfiguration.Initialize();
Globals.mForm = new MainForm();
Globals.pCall = new PagerCall();
//Globals.beepDetected = new BeepDetected();
Application.Run(Globals.mForm);
}
当主线程完成时,它会 Flink (上面的代码也是这样),我只是不知道我做错了什么。
我试过很多方法,比如让主线程的调用是异步的,但没有改变。我只是想让led看起来 Flink ,而不会阻塞主线程。
3条答案
按热度按时间mutmk8jj1#
对于Windows窗体。我建议您尝试BackgroundWorker。它在UI线程中提供了“ReportProgress”事件更改/更新控件,而不需要额外的代码。
如果要手动创建线程/任务。必须对UI线程执行“调用”以访问其资源。这需要您必须实现和理解的附加代码。示例. Thread-Safe Control
tquggr8v2#
我建议使用
System.Windows.Forms.Timer
而不是线程,这样你就不用担心线程的安全性和协调性了,将定时器的Interval
设置为1000
,并将下面的代码放入Tick
事件处理程序中:可以使用
Enabled
属性或Start
/Stop
方法启动和停止计时器。zujrkrfu3#
你的帖子说你是
尝试将LED的图像从一种颜色改变为另一种颜色睡眠一秒钟,然后变回来。
这里,在一般形式中,是一种在特定时间间隔更新UI元素(例如,改变颜色或图像)而不阻塞UI线程的方法。
其中: