C#Timer Interval不起作用

时间:2016-08-08 13:00:56

标签: c# timer tweetsharp

如标题中所述,Timer Interval中的某些内容似乎已关闭。计时器应该从“DateTimePicker”获取时间,将其转换为秒和&将Interval更改为DateTimePicker上设置的时间。之后它应该在推特上发布推文,虽然它不起作用。它只是一遍又一遍地发送垃圾邮件。

            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)";
    }

结果:

Picture 1 Picture 2

如图所示,标签不会刷新,也不会使用新的设定时间。它只是随机发布文本。 在此先感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

Timer.Interval属性包含以下文档:

  

Elapsed事件之间的时间,以毫秒为单位。该值必须大于零,并且小于或等于Int32.MaxValue。默认值为100毫秒。

(我的重点)

所以3930毫秒比每4秒钟稍快一点。

实现这一点的另一种方法是计算应该提交下一篇文章的DateTime,然后“经常”运行计时器,比如说每秒一次,然后检查当前计算机时间是否已超过计算的DateTime值。

如果有,做任何事情,然后计算它应该运行的下一个时间点。

答案 1 :(得分:1)

正如其他人所提到的,Interval属性需要毫秒,而不是秒。在任何情况下,您需要手动进行转换。 DateTimePicker返回DateTime值。您可以使用DateTime.TimeOfDay属性将DateTime的时间部分作为TimeSpan。时间跨度的属性返回各个时间部分,或以特定单位测量的总持续时间。例如,TimeSpan.TotalMilliseconds以毫秒为单位返回当前时间值。

您需要写的只有:

postInterval.Interval = (int)IntervalChoose.Value.TimeOfDay.TotalMilliseconds;

它处理无效间隔问题,仅在您希望每10分钟或每1小时发送一条消息时才有效。

如果您想在设定的时间发送消息,则无法使用System.Windows.Forms.Timer,因为它不允许您设置特定的开始时间或启动延迟。在这种情况下,您必须使用System.Threading.Timer

答案 2 :(得分:0)

首先,我看到,你设置间隔秒。但你需要在毫秒内设置postInterval.Interval =((IntervalChoose.Value.Hour * 3600)+(IntervalChoose.Value.Minute * 60)+ IntervalChoose.Value.Second)* 1000;