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'。存在显式转换(您是否缺少演员?)
答案 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;
}