【发布时间】:2012-10-23 03:15:16
【问题描述】:
我有一个 winforms 应用程序,我将通过任务调度程序调用它来下载文件并将它们插入数据库。但是文件何时可用是不可预测的,所以我使用计时器 (System.Windws.Forms.Timer) 来轮询文件。
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
if (args != null && args.Length > 0)
{
Form1 f1 = new Form1();
if (f1.IsLive)
{
f1.OnLaunch(); // tests DB connection and reads and updates the expiry date list.
if (args[0] == "FullStats")
f1.FullStatsDataPump();
else if (args[0] == "OptionsStats")
{
f1.OptionsStatsTimer_Tick(null, null);
f1.OptionsStatsTimer.Start();
}
else if (args[0] == "OptionsTraded")
{
f1._optionsTradedTimer_Tick(null, null);
f1.OptionsTradedTimer.Start();
}
else
{
EmailManager.InvalidInputArgument(args[0]);
Application.Exit();
}
Application.Run();
}
}
在上面的代码 sn-p 中,OptionsTradedTimer / OptionsStatsTimer 都轮询文件,然后开始以Application.Exit() 结尾的进程。这运行得很好,但之后它陷入了无限的消息循环。我认为Application.Run() 将在第一个计时器滴答后立即被调用,因此当Application.Exit() 最终被调用时,它将结束消息循环。但是,如果我单步执行代码,那么在Application.Exit() 之后,程序将返回到它起源的 timer.tick(),然后继续到底部的Application.Run()。底部的Application.Run() 是必需的,因为没有它,计时器只会滴答一次,然后应用程序将退出。
那么我如何正确地告诉应用程序退出呢?或者我应该在哪里打电话给Application.Run()?
【问题讨论】:
-
Application.Exit() 不会导致程序结束。当 Main() 返回时程序结束。 msdn.microsoft.com/en-us/library/… Application.Run() 创建一个消息循环(一个无限循环),在 Application.Exit() 被调用时终止。它不起作用的原因是代码没有逻辑意义。因此,您需要重新设计您的应用程序。
-
问题已解决 - 我需要做的就是确保计时器滴答方法在第一次滴答时没有调用 Application.Exit()。我将在星期一删除这个问题,因为我看不出这个解决方案对其他人有什么用处。谢谢大家。
-
听起来不错。我仍然认为你想修改你的设计。 :-)
标签: c# timer scheduled-tasks message-loop