我正在構建一個鬧鐘應用程式并使用 System.Threading.Timer。計時器結束后,我想顯示用戶控制元件以允許用戶選擇喚醒或打盹。在回呼中添加新控制元件或表單后,表單正在關閉。
private void setTimerButton_Click(object sender, EventArgs e)
{
try
{
alarmDate = setAlarmDateTimePicker.Value - DateTime.Now;
var alarmClock = new System.Threading.Timer(AlarmCallback, null, alarmDate, TimeSpan.Zero);
addedAlarmTextBox.Text = setAlarmDateTimePicker.Text;
}
catch
{}
finally
{
setAlarmDateTimePicker.Value = DateTime.Now;
}
}
private void AlarmCallback(object state)
{
this.Controls.Add(new AlarmBeepsForm());
}
據我所知,它與執行緒有關,但我對編程很陌生,我不明白出了什么問題。如何更改代碼以成功添加控制元件,或者我應該使用其他型別的計時器?
uj5u.com熱心網友回復:
除非您設定Control.CheckForIllegalCrossThreadCalls為false,否則您應該呼叫Control.Invoke以切換到創建控制句柄的執行緒。
private void setTimerButton_Click(object sender, EventArgs e)
{
try
{
alarmDate = setAlarmDateTimePicker.Value - DateTime.Now;
var alarmClock = new System.Threading.Timer(AlarmCallback, null, alarmDate, TimeSpan.Zero);
addedAlarmTextBox.Text = setAlarmDateTimePicker.Text;
}
catch
{}
finally
{
setAlarmDateTimePicker.Value = DateTime.Now;
}
}
private void AlarmCallback(object state)
{
this.Invoke(new Action(() => this.Controls.Add(new AlarmBeepsForm()));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/522147.html
標籤:C#表格
