2 回答
TA贡献1828条经验 获得超3个赞
System.Threading.Timerring()在线程池中的一个线程上运行。ring()反过来尝试实例化一个应该始终在主线程上完成的窗体(对 windows 窗体的所有访问都应该从主线程完成)。
请改用以下内容:
private void ring()
{
if (System.DateTime.Now.ToString("HH:mm") == temp && songisplaying == false)
{
songisplaying = true;
if (this.InvokeRequired)
this.Invoke(new MethodInvoker(()=>{ringOnMainThread()}));
else
ringOnMainThread();
}
}
private void ringOnMainThread()
{
soundplayer.PlayLooping();
timer1.Start();
if (WindowState == FormWindowState.Minimized)
{
this.Show();
WindowState = FormWindowState.Normal;
}
wakeupForm win = new wakeupForm();
win.Show();
}
请注意,我已songisplaying = true;采取行动以避免竞争条件。
TA贡献1784条经验 获得超9个赞
我相信您应该在显示表单时停止计时器。
(检查你的计时器间隔。如果它在一分钟内滴答不止一次,它会多次击中你的 ring() 方法)。
您应该在 ring() 方法中停止您的计时器,并在您的 wakeupForm 的 FormClosing 上重新启动。
private void ring() {
if (System.DateTime.Now.ToString("HH:mm") == temp && songisplaying == false) {
soundplayer.PlayLooping();
timer1.Stop();//Stop your timer.
songisplaying = true;
if (WindowState == FormWindowState.Minimized)
{
this.Show();
WindowState = FormWindowState.Normal;
}
wakeupForm win = new wakeupForm();
win.Form_Closed += win_Closed;
win.Show();
}
private void wnd_Closed(object sender, EventArgs e)
{
timer1.Start();
}
- 2 回答
- 0 关注
- 151 浏览
添加回答
举报