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 關注
- 189 瀏覽
添加回答
舉報