我在这里试图找到一个已解决的问题来帮我解决问题。不幸的是,我不太了解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)
我立即收到错误:
我做的阅读越多,我看到越多的事件处理程序被传递,我还没有理解他们做了什么。也许我需要的是一些好文学的链接。我有能力独自寻找这个,但我想这里的很多人可能会链接到其他一些好的文献,这些文献更具体到我想要理解的内容。
*到目前为止我找到的东西可能对我的情况下的人有用: https://msdn.microsoft.com/en-us/library/aa288459(v=vs.71).aspx
答案 0 :(得分:3)
VS中的错误 - 您添加了timerSystemTimer
但未删除timerMainTick
组件仍然引用timerMainTick_Tick
作为其Tick
事件的处理程序。编译器不再找到此处理程序方法,因为您已将其更改为timerSystemTimer_Tick
。
添加不同的计时器 - 永远不要修改设计器文件代码。您可以将System.Timers.Timer实例添加到类代码中,在OnStart
中实例化它并为Elapsed
事件提供处理程序。这是你的sample。