C# 定时器间隔不起作用
C# Timer Interval doesn't work
正如标题所写,定时器间隔中的某些内容似乎已关闭。计时器应从 "DateTimePicker" 获取时间,将其转换为秒并将间隔更改为 DateTimePicker 上设置的时间。之后它应该 post 在 twitter 上发一条推文,尽管它不起作用。它只是一遍又一遍地发送垃圾邮件 posts。
private void IntervalChoose_ValueChanged(object sender, EventArgs e) //DateTimePicker
{
postInterval.Interval = (IntervalChoose.Value.Hour * 3600) + (IntervalChoose.Value.Minute * 60) + IntervalChoose.Value.Second;
saveTimerInterval = postInterval.Interval; //saveTimerInterval is set 0 at the beginning
MessageBox.Show("Current Interval in Seconds: " + postInterval.Interval.ToString());
}
private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "Start Bot") //Starts program (works)
{
IntervalChoose.Enabled = false;
MessageBox.Show(saveTimerInterval.ToString());
postInterval.Interval = saveTimerInterval; //Sets the interval (once again, safecall)
postInterval.Start(); //starts posting.
button1.Text = "Stop Bot";
}
private void postInterval_Tick(object sender, EventArgs e)
{
var service = new TwitterService("", "", "", ""); //Auth Keys
var twitterStatus = service.SendTweet(new SendTweetOptions() { Status = "Hi" + counter });
if (twitterStatus != null)
{
MessageBox.Show("Your Message:\n\n\"" + "Hi" + counter + "\"\n\n has been successfully tweeted.", "Success!", MessageBoxButtons.OK);
counter++;
}
else
{
//MessageBox.Show("An Error occured while the Bot was running. Please Contact the Developer.", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
label2.Text = "Next Post in:\n" + (postInterval.Interval / 3600) + " Hour(s) " + ((postInterval.Interval / 3600) / 60) + " Minute(s) " + (((postInterval.Interval / 3600) / 60) / 60) + " Second(s)";
}
结果:
如图所示,标签不会刷新,也不会使用新设置的时间。它只是在随机时间随机 posted 文本。
在此先感谢您的帮助。
Timer.Interval 属性 有这个文档:
The time, in milliseconds, between Elapsed events. The value must be greater than zero, and less than or equal to Int32.MaxValue. The default is 100 milliseconds.
(我的重点)
所以 3930 毫秒只比每 4 秒快一点点。
实现这个的另一种方法是计算下一个 post 应该提交的日期时间,然后 运行 计时器 "often enough",比如每秒一次,然后只是检查当前计算机时间是否已超过计算的 DateTime 值。
如果有,随便做,然后计算下一个时间点应该运行。
起初我看到,您设置的间隔时间为秒。但是你需要以毫秒为单位设置它 postInterval.Interval = ((IntervalChoose.Value.Hour * 3600) + (IntervalChoose.Value.Minute * 60) + IntervalChoose.Value.Second)*1000;
正如其他人提到的,Interval
属性 需要 毫秒 ,而不是秒。无论如何,您不需要 手动进行转换。一个 DateTimePicker returns 一个 DateTime 值。您可以使用 DateTime.TimeOfDay property. The timespan's properties return the various time parts, or the total duration measured in a specific unit. For example, TimeSpan.TotalMilliseconds returns 以毫秒为单位的当前时间值来获取 DateTime 的时间部分作为 TimeSpan。
您只需要写:
postInterval.Interval = (int)IntervalChoose.Value.TimeOfDay.TotalMilliseconds;
这解决了无效间隔问题,并且仅在您希望例如每 10 分钟或每 1 小时发送一条消息时才有效。
如果您想在设定的时间发送消息,则不能使用 System.Windows.Forms.Timer because it doesn't allow you to set a specific start time or start delay. In this case you'd have to use System.Threading.Timer
正如标题所写,定时器间隔中的某些内容似乎已关闭。计时器应从 "DateTimePicker" 获取时间,将其转换为秒并将间隔更改为 DateTimePicker 上设置的时间。之后它应该 post 在 twitter 上发一条推文,尽管它不起作用。它只是一遍又一遍地发送垃圾邮件 posts。
private void IntervalChoose_ValueChanged(object sender, EventArgs e) //DateTimePicker
{
postInterval.Interval = (IntervalChoose.Value.Hour * 3600) + (IntervalChoose.Value.Minute * 60) + IntervalChoose.Value.Second;
saveTimerInterval = postInterval.Interval; //saveTimerInterval is set 0 at the beginning
MessageBox.Show("Current Interval in Seconds: " + postInterval.Interval.ToString());
}
private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "Start Bot") //Starts program (works)
{
IntervalChoose.Enabled = false;
MessageBox.Show(saveTimerInterval.ToString());
postInterval.Interval = saveTimerInterval; //Sets the interval (once again, safecall)
postInterval.Start(); //starts posting.
button1.Text = "Stop Bot";
}
private void postInterval_Tick(object sender, EventArgs e)
{
var service = new TwitterService("", "", "", ""); //Auth Keys
var twitterStatus = service.SendTweet(new SendTweetOptions() { Status = "Hi" + counter });
if (twitterStatus != null)
{
MessageBox.Show("Your Message:\n\n\"" + "Hi" + counter + "\"\n\n has been successfully tweeted.", "Success!", MessageBoxButtons.OK);
counter++;
}
else
{
//MessageBox.Show("An Error occured while the Bot was running. Please Contact the Developer.", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
label2.Text = "Next Post in:\n" + (postInterval.Interval / 3600) + " Hour(s) " + ((postInterval.Interval / 3600) / 60) + " Minute(s) " + (((postInterval.Interval / 3600) / 60) / 60) + " Second(s)";
}
结果:
如图所示,标签不会刷新,也不会使用新设置的时间。它只是在随机时间随机 posted 文本。 在此先感谢您的帮助。
Timer.Interval 属性 有这个文档:
The time, in milliseconds, between Elapsed events. The value must be greater than zero, and less than or equal to Int32.MaxValue. The default is 100 milliseconds.
(我的重点)
所以 3930 毫秒只比每 4 秒快一点点。
实现这个的另一种方法是计算下一个 post 应该提交的日期时间,然后 运行 计时器 "often enough",比如每秒一次,然后只是检查当前计算机时间是否已超过计算的 DateTime 值。
如果有,随便做,然后计算下一个时间点应该运行。
起初我看到,您设置的间隔时间为秒。但是你需要以毫秒为单位设置它 postInterval.Interval = ((IntervalChoose.Value.Hour * 3600) + (IntervalChoose.Value.Minute * 60) + IntervalChoose.Value.Second)*1000;
正如其他人提到的,Interval
属性 需要 毫秒 ,而不是秒。无论如何,您不需要 手动进行转换。一个 DateTimePicker returns 一个 DateTime 值。您可以使用 DateTime.TimeOfDay property. The timespan's properties return the various time parts, or the total duration measured in a specific unit. For example, TimeSpan.TotalMilliseconds returns 以毫秒为单位的当前时间值来获取 DateTime 的时间部分作为 TimeSpan。
您只需要写:
postInterval.Interval = (int)IntervalChoose.Value.TimeOfDay.TotalMilliseconds;
这解决了无效间隔问题,并且仅在您希望例如每 10 分钟或每 1 小时发送一条消息时才有效。
如果您想在设定的时间发送消息,则不能使用 System.Windows.Forms.Timer because it doesn't allow you to set a specific start time or start delay. In this case you'd have to use System.Threading.Timer