【问题标题】:C# Timer Interval doesn't workC# 定时器间隔不起作用
【发布时间】:2016-12-14 06:29:04
【问题描述】:

正如标题中所写,计时器间隔中的某些内容似乎已关闭。计时器应该从“DateTimePicker”中获取时间,将其转换为秒并将间隔更改为 DateTimePicker 上设置的时间。之后它应该在 Twitter 上发布一条推文,尽管它不起作用。它只是一遍又一遍地发送垃圾邮件。

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

结果:

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

【问题讨论】:

  • 你知道Interval 是毫秒吗?另外,不要以这种方式使用计时器。将其设置为每秒tick,然后在tick 事件中检查预定时间是否已过,如果已过则发送并清除“任务”,否则不执行任何操作
  • 或者您可以使用 TimeOfDay 属性从 DateTime 获取时间部分?这将返回一个 TimeSpan,其 TotalMilliseconds 属性以毫秒为单位返回时间?你可以写postInterval.Interval = (int)IntervalChoose.Value.TimeOfDay.TotalMilliseconds;
  • lmao 我完全忘了是MS;我会试试@PanagiotisKanavos

标签: c# timer tweetsharp


【解决方案1】:

Timer.Interval 属性具有以下文档:

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

(我的重点)

所以 3930 毫秒只是比每 4 秒快一点。


实现此目的的另一种方法是计算应提交下一篇文章的日期时间,然后“经常”运行计时器,例如每秒一次,并检查当前计算机时间是否已超过计算出的日期时间价值。

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

【讨论】:

    【解决方案2】:

    正如其他人提到的,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

    【讨论】:

      【解决方案3】:

      起初我看到,您以秒为单位设置间隔。但是你需要以毫秒为单位设置 postInterval.Interval = ((IntervalChoose.Value.Hour * 3600) + (IntervalChoose.Value.Minute * 60) + IntervalChoose.Value.Second)*1000;

      【讨论】:

      • 好吧,即使这样,您也将根据午夜创建一个内部。因此,只有当用户将机器人设置在午夜时,它才会按预期工作。正确的时间间隔需要将当前日期时间考虑到计算中
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      相关资源
      最近更新 更多