我用c#做了一个winform程序,在主窗体中,有个system.windows.forms.timer定时器,现在碰到一个问题,发现偶尔会出现 定时器触发不了的问题,无法进入到定时器的timer_tick里,如果用鼠标点击一下主窗体或者将主窗体在最大和最小化之间切换后,定时器又自动恢复 了。请高手帮忙分析一下!
我也遇到过,不知道什么问题。后来全换成线程就好了
最近也遇到麻烦,打印机老是提示没安装驱动,安装后能用,第二天又提示没驱动,又得安装后使用,天天如此.
这个问题可查看是否有其他线程拖住影响?
否则点击窗口的某个按钮后,不会自动恢复,现在是不重启程序,切换下鼠标定时器就自动恢复了
说你定时器是在什么时候启动的?是不是出发了你上面说的事件才会启动定时器
虽然我不太想回答timer的问题
但是既然问了,那就回答
system.windows.forms.timer 是在主进程插入消息完成的。
所以,你要说UI卡了,我们只能说窗体处于未激活状态或者窗体消息泵正在处理别的消息
UI没卡,鼠标点击什么的都有反应,就是所有的定时器都进不去了,好像触发不了了一样。因为有个定时器显示当前时间,出问题的时候,这个时间是不动的,但是鼠标点击某个按钮以后,就自动恢复了
时间不动不代表没有执行。可能是UI刷新被迟滞了刷新不及时。你还是在日志中输出一下确认下真的没执行。
建议改为独立线程处理更好。
还是用线程+锁吧,应该是主线程东西太多了。简单的界面就没有什么问题
这种定时器是不是相当于新线程呢?可能和线程里更新UI的问题类似吧?
线程更新 TextBox 示例
private void BtnInit_Click(object sender, EventArgs e)
{
ShowInfo("开始初始化...");
_CardRS = _UC.Resolve<ICardRS>();
Task.Factory.StartNew(() =>
{
// 耗时操作,在Task中处理;
if (_CardRS.Init())
{
ShowInfo("初始化成功");
}
else
{
ShowInfo("初始化失败");
}
});
}
private void ShowInfo(string info)
{
BeginInvoke(new Action(() =>
{
// 更新展示用的文本框的内容;
TBInfo.Text += $"{info}\r\n\r\n";
}));
}
c#有三种timer可用,system.windows.forms.timer不是多线程。这可能是出现当前问题的原因。即在timer刷新的时刻,被其他的www.9iBee.comUI刷新所阻碍,丢失了消息。
换多线程timer,应该不容易出现这种问题。
这个遇到过,当搜索数据时,显示时间就会卡顿,数据搜索结束就恢复,采用异步即可。