【问题标题】:C# Windows Service, Timer won't tickC# Windows 服务,计时器不会打勾
【发布时间】:2017-06-24 16:55:41
【问题描述】:

我在这里四处寻找,试图找到一个已解决的问题来帮助我解决我的问题。不幸的是,我对 C# 和 Forms/Services 的了解不够,无法解释许多答案,所以我想我会在这里发布我的问题,因为它的独特性,看看我是否能得到足够的答案。

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

我已经非常擅长使用 VisualStudios2017 创建 Windows 窗体,并且我的 Java 知识帮助我很快掌握了 C#。

不过,最近我接到了开发 Windows 服务的任务,该服务将在后台运行,每分钟左右执行一些重复性任务。

由于我熟悉向 Windows 窗体添加功能的“拖放”技术,我的主管建议我在我的服务中使用计时器,所以,我就是这样做的,我做了一个“拖放”来添加将计时器组件添加到我的服务中,并将其重命名为“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 Source Code,并添加一个组件

private System.Timer.Timer timerSystemTimer;

然后,在Service源代码中修改之前的方法

private void timerMainTick_Tick(object sender, EventArgs e)

private void timerSystemTimer_Tick(object sender, EventArgs e)

我立即得到一个错误:


我阅读的越多,我看到的事件处理程序越多,但我还没有理解它们的作用。也许我需要的是一些好的文学作品的链接。我有能力自己寻找这个,但我想这里的很多人可能会链接到其他一些好的文献,这些文献更具体到我想在这里理解的内容。

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

【问题讨论】:

标签: c# timer


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 2018-10-02
    • 2012-10-04
    相关资源
    最近更新 更多