【发布时间】: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
【问题讨论】:
-
使用其中一个计时器并阅读 msdn 以查看示例
-
这不仅仅是我所说的minimal reproducible example。