C#Windows服务,计时器不会勾选

时间:2017-06-24 16:55:41

标签: c# timer

我在这里试图找到一个已解决的问题来帮我解决问题。不幸的是,我不太了解C#和Forms / Services能够解释许多答案,所以我想我会在这里发布我的问题,它的唯一性,看看我是否能得到足够的答案。

我最近在当地公司实习,学习C#和SQL来管理他们的运输/库存物流。

我已经非常擅长使用VisualStudios2017创建Windows窗体,而且我对Java的了解可以帮助我快速掌握C#。

然而,最近我被赋予了开发Windows服务的任务,该服务将在后台运行,并且每分钟左右执行一些重复性任务。

由于我熟悉向Windows窗体添加功能的“拖放”技术,我的主管建议我在我的服务中使用Timer,所以,这就是我所做的,我做了一个“拖放”添加我的服务的计时器组件,并重命名为“timerMainTick”

这是我的代码。我想从简单开始,所有这些代码都移动到一些本地目录(以下称为$ DIR),创建一个文件夹$ DIR / GabbServiceDir,并创建一个文本文件$ DIR / GabbServiceDir / AnotherTest.txt“。但是,每次计时器滴答时,它应该创建(如果它还不存在)一个新的文本文档“$ DIR / GabbServiceDir / Test.txt”并且每2.5秒附加一次日期时间。这不会发生。

namespace GabbService
{
    public partial class GabbService : ServiceBase
    {
        public string dir = "../../Users/Tyler/GabbServiceDir";

        public GabbService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            Directory.CreateDirectory(dir);
            timerMainTick.Interval = 2500; //miliseconds = 2.5seconds
            File.AppendAllText(dir + "/AnotherTest.txt","asdiofbhjasdflikjbasdf\r\n");
            timerMainTick.Enabled = true;
            timerMainTick.Start();
        }

        protected override void OnStop()
        {

        }

        private void timerMainTick_Tick(object sender, EventArgs e)
        {
            timerMainTick.Enabled = false;
            File.AppendAllText(dir + "/Test.txt", DateTime.Now.ToString() + "\r\n");
            timerMainTick.Enabled = true;
        }
    }
}

服务启动后的目录及其内容的图片。

这是Powershell中的$ DIR / GabbServiceDir

PS C:\Users\Tyler\GabbServiceDir> ls


    Directory: C:\Users\Tyler\GabbServiceDir


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        6/23/2017   9:54 PM             72 AnotherTest.txt

PS C:\Users\Tyler\GabbServiceDir> cat .\AnotherTest.txt
asdiofbhjasdflikjbasdf

timerMainTick是Windows.Forms.Timer,提供的许多解决方案都表明使用了不同类型的计时器System.Timers.Timer。

这一切都很好,并且可以解决我的问题,但是当这种新类型的计时器滴答作响时尝试做某事时会出现问题。当我在服务设计器中双击Windows.Forms.Timer时,它会自动编写一堆源代码,并为我提供一种开始编写代码的方法,当计时器滴答时,它会神奇地执行。我还不熟悉背景中发生的所有魔法,因为在我实习的那天,我才开始学习C#。我不知道如何命名自定义对象的方法,以便“背景魔法”可以工作,因此我无法与我的类似问题提供一些解决方案。

也许有人可以启发我。

例如。假设我进入Designer源代码,并添加一个组件

private System.Timer.Timer timerSystemTimer;

然后,在服务源代码中更改以前的方法

private void timerMainTick_Tick(object sender, EventArgs e)

private void timerSystemTimer_Tick(object sender, EventArgs e)

我立即收到错误:

ErrorMessage

我做的阅读越多,我看到越多的事件处理程序被传递,我还没有理解他们做了什么。也许我需要的是一些好文学的链接。我有能力独自寻找这个,但我想这里的很多人可能会链接到其他一些好的文献,这些文献更具体到我想要理解的内容。

*到目前为止我找到的东西可能对我的情况下的人有用:     https://msdn.microsoft.com/en-us/library/aa288459(v=vs.71).aspx

1 个答案:

答案 0 :(得分:3)

VS中的错误 - 您添加了timerSystemTimer但未删除timerMainTick组件仍然引用timerMainTick_Tick作为其Tick事件的处理程序。编译器不再找到此处理程序方法,因为您已将其更改为timerSystemTimer_Tick

添加不同的计时器 - 永远不要修改设计器文件代码。您可以将System.Timers.Timer实例添加到类代码中,在OnStart中实例化它并为Elapsed事件提供处理程序。这是你的sample