将分钟转换为毫秒

时间:2016-07-16 08:09:46

标签: c# .net winforms timer .net-4.5

Winforms中的Timer类有一个名为Interval的属性

  

获取或设置Tick事件相对于Tick事件的最后一次出现之前的时间(以毫秒为单位)。

在我的表单上,我有一个文本框,用户可以在几分钟内输入他们想要设置计时器的时间。

但是我无法使用我所做的功能将分钟转换为毫秒:

public static double ConvertMinutesToMilliseconds(double minutes)
{
  return TimeSpan.FromMinutes(minutes).TotalMilliseconds;
}

我的代码如下所示:

if (result1 == DialogResult.Yes)
{
    Timer tm;
    tm = new Timer();

    tm.Interval = int.Parse(textBox2.Text);
    tm.Interval = ConvertMinutesToMilliseconds(tm.Interval);
    tm.Tick += new EventHandler(button1_Click);

    string pastebuffer = DateTime.Now.ToString();
    pastebuffer = "### Edited on " + pastebuffer + " by " + txtUsername.Text + " ###";
    Clipboard.SetText(pastebuffer);

    tm.Start();
}

我的错误是:无法将类型'double'隐式转换为'int'。存在显式转换(您是否缺少演员?)

3 个答案:

答案 0 :(得分:6)

System.Windows.Forms.Timer.Interval属于int类型 - 由于System.Timers.Timer.Interval的类型为double,因此有点混乱。因此,您尝试将方法的结果(double)分配给类型为int的属性。那不会起作用。当然,你可以施展:

timer.Interval = (int) ConvertMinutesToMilliseconds(...);

但是,我借此机会对您的代码进行一些重构。最初,您将分钟值分配给timer.Interval,这在单位方面完全是错误的。你只是有效地使用它作为临时变量 - 所以要更清楚,并尝试使用"在声明时分配"为了清楚起见:

if (result1 == DialogResult.Yes)
{
    // TODO: Use int.TryParse to handle invalid input
    int minutes = int.Parse(textBox2.Text);
    Timer timer = new Timer
    {
        // I don't actually think it's worth having a method for this...
        Interval = (int) TimeSpan.FromMinutes(minutes).TotalMilliseconds
    }
    // Use method group conversion instead of new EventHandler(...)
    // TODO: Rename button1_Click to a name which says what it actually does
    timer.Tick += button1_Click;

    // Interpolated strings make life simpler
    Clipboard.SetText($"### Edited on {DateTime.Now} by {txtUsername.Text} ###");

    timer.Start();
}

然后你只需要担心(如果我没记错的话)关于保留对定时器实例的引用,这样就不会收集垃圾。所以你可能想要某种活跃的计时器列表"。我可能错误地记住了这一点,但你可能还是想保留这个列表,这样你就可以在适当的时候停止所有活跃的计时器。

答案 1 :(得分:2)

您的函数接受double,但您正在输入int(此转换可能会隐式发生),然后您将此时间转换为毫秒(可能是{{1} (以及)并将其作为int返回。然后,您将双精度分配给double(tm.Interval)。

最后一次转换不能隐式发生(这意味着编译器不会为你做这件事)因为你将一个可以代表分数(int)的类型转换为一个可以&#39的类型; t(double),因此信息可能会丢失。

要解决此问题,您可以更改行

int

tm.Interval = ConvertMinutesToMilliseconds(tm.Interval);

或者,更方便的是,

tm.Interval = (int) ConvertMinutesToMilliseconds(tm.Interval);

public static double ConvertMinutesToMilliseconds(double minutes)

由于它并不复杂,您可能还想使用

public static int ConvertMinutesToMilliseconds(int minutes)

而不是

minutes*60000

答案 2 :(得分:0)

您可以方便地前往:

public static int ConvertMinutesToMilliseconds(int minutes)
{
    return (int) TimeSpan.FromMinutes(minutes).TotalMilliseconds;
}