簡體   English   中英

C#Windows服務,計時器不會打勾

[英]C# Windows Service, Timer won't tick

我一直在這里試圖找到一個已解決的問題來幫助我解決我的問題。 不幸的是,我不太了解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

VS中的錯誤 - 您添加了timerSystemTimer但沒有刪除仍然引用timerMainTick_Tick作為其Tick事件處理程序的timerMainTick組件。 由於您將其更改為timerSystemTimer_Tick因此編譯器不再找到此處理程序方法。

添加不同的計時器 - 從不修改設計器文件代碼 您可以將System.Timers.Timer實例添加到類代碼中,在OnStart實例化它並為Elapsed事件提供處理程序。 這是給你的樣品

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM