我和我的朋友正在制作一个播客播放器。每30分钟,60分钟或2小时,该程序应查看rss提要并查看是否已发布新剧集。如果是这样,我们的节目中的剧集列表应该在添加新剧集时刷新。
所以,现在我们正在尝试使用System.Timers.Timer类来设置执行我们的方法以寻找新剧集的间隔。要测试我们的方法,我们只想每10秒打印一个消息框。但是在10秒之后,程序就会不断发布新的消息框。我们如何重置计时器并在10秒后只显示一个新的消息框?是因为我们正在使用消息框吗?如果我们除了显示消息框之外还做其他事情,定时器是否会重置?我们尝试将信息打印到控制台,但出现了同样的问题。
这是我们的代码:
using System;
using System.Timers;
using System.Windows.Forms;
using Timer = System.Timers.Timer;
public static class TimerInitializer
{
public static Timer timer; // From System.Timers
public static void Start()
{
timer = new Timer(10000); // Set up the timer for 10 seconds
//
// Type "_timer.Elapsed += " and press tab twice.
//
timer.Elapsed += new ElapsedEventHandler(timerElapsed);
timer.Enabled = true; // Enable it
}
public static void timerElapsed(object sender, ElapsedEventArgs e)
{
MessageBox.Show("Hello");
}
}
答案 0 :(得分:3)
您可以在Timer.Elapsed
事件触发时禁用计时器,显示消息,然后在用户解除MessageBox
时重新启用计时器:
public static void timerElapsed(object sender, ElapsedEventArgs e)
{
timer.Stop(); // stop the timer
MessageBox.Show("Hello");
timer.Start(); // restart it; you'll get another msg in 10 seconds
}
通常情况下,使用MessageBox.Show
阻止UI线程,您会注意到在显示消息时无法单击UI。
除了UI线程之外,System.Timers.Timer
在自己的线程上运行。当间隔过去时,它运行其代码(在这种情况下,显示一条消息),然后只是继续前进,直到下一个间隔再次过去。你得到的是很多消息框,它们都没有阻止UI或彼此。
你可以read more here。这篇文章有点旧,但有关不同计时器的信息仍然相关。
答案 1 :(得分:0)
MessageBox是一个静态类。 MessageBox.Show()每次都为您提供一个新对象。我认为MessageBoxes也是阻止代码继续运行的对话框,这可能会使你的计时器崩溃。我建议切换到使用其他东西进行测试。验证您具有所需行为的最简单方法是使用带有测试语句的Console.WriteLine()并查看Visual Studio中的控制台/输出窗口。
或者使用消息框而不是使用消息框创建一个具有类级别范围的附加单个表单,并显示和隐藏页面以指示您的计时器已过期。
请参阅:http://www.techotopia.com/index.php/Hiding_and_Showing_Forms_in_C_Sharp