![](/img/trans.png)
[英]Why does System.Threading.Timer callback successfully update UI?
[英]Why doesn't System.Threading.Timer callback fire?
我沒有使用Windows窗體計時器-我正在使用System.Threading.Timer。 實例化計時器時不會引發任何異常,據我所知,不需要顯式啟動System.Threading.Timer。
我試過使用System.Timers.Timer(請參閱代碼中的注釋),並且不費吹灰之地更改回調的簽名。 在回調方法內部,我存根了一些EventLog寫入,甚至沒有寫入事件日志的第一個寫入。 我在事件日志中看到的全部是MyService.OnStart,然后是MyService啟動(均來自OnStart事件)。 為什么計時器回調事件不觸發?
public partial class MyService : ServiceBase
{
private static System.Threading.Timer timer;
public MyService()
{
InitializeComponent();
if (!System.Diagnostics.EventLog.SourceExists("MyService"))
{
System.Diagnostics.EventLog.CreateEventSource(
"MyService", "MyServiceLog");
}
eventLog1.Source = "MyService";
eventLog1.Log = "MyServiceLog";
}
protected override void OnStart(string[] args)
{
eventLog1.WriteEntry("MyService.OnStart event fired");
// setup timer to poll and execute an event
//Timer timer = new Timer(new TimerCallback(CheckCalls), null, 0, 10000);
try
{
timer = new System.Threading.Timer(new System.Threading.TimerCallback(CheckCalls), null, 0, 10000);
}
catch (Exception ex)
{
eventLog1.WriteEntry(ex.Message + " Stacktrace: " + ex.StackTrace);
}
eventLog1.WriteEntry("MyServicestarted");
GC.KeepAlive(timer);
}
}
和回調方法CheckCalls:
private static void CheckCalls(object objectState)
{
EventLog eventLog1 = new EventLog("MyServiceLog", "DAVIDWIN7", "MyService");
eventLog1.WriteEntry("MyService is polling");
}
精簡版-由於某種原因,當您先構建->清理解決方案,然后構建->生成解決方案時,Visual Studio不會重建您的安裝項目。 我相信上面的代碼可以正常工作,但是我嘗試了許多不同的修復,而沒有明確地右鍵單擊安裝項目並選擇Build。
我以為Clean Solution會強制所有項目在下一個版本中進行重建???
您是否檢查運行服務的帳戶是否有權訪問事件日志?
計時器線程寫入事件日志肯定是錯誤的。
我可以在計算機上使用它,但是我用Console.writeline替換了所有事件日志,因為我不想弄亂我的事件日志權限。
請您可以下載該測試應用程序,該應用程序完全反映了您正在談論的方案:
我剛剛創建了這個。 該服務可以有效地使用與您相同的代碼。 唯一的區別是,我已使用工具箱將事件日志拖放到服務設計器上-將日志設置為“應用程序”,源設置為“ Service1”。
在項目文件夾中打開VS命令提示符,轉到bin\\debug
並運行installutil windowsservice1.exe
指定一些憑據(因此,您直接從bin輸出文件夾中安裝dev服務)。
啟動服務並監視應用程序日志-如您希望從代碼中看到的那樣,它將每十秒鍾寫入一次。
假設這在您的計算機(tm)上像在我的計算機(tm)上一樣起作用,那么我建議問題出在事件記錄本身,或者恐怖的恐怖-您的服務不是從生成輸出文件夾運行的(大多數我們團隊中的開發人員堅持要從不同的文件夾運行其開發服務,然后在開始調試時忘記真正更新二進制文件時發誓!)。
正如我在評論中所建議的那樣,您確實確實需要能夠將調試器連接到此程序並斷點回調以驗證它沒有被觸發。 我從不依賴於事件日志來診斷消息,因為日志可能已滿,或者權限可能阻止您執行其他操作,等等-它可能是Windows平台組件,但它並不如我所願。
但是,調試器很少說謊(除非已部署的二進制文件已過期;))。 編譯項目的調試版本,並確保它是服務列表中安裝的版本 ,啟動它,然后直接附加到服務exe (試圖附加到[service] .vshost.exe是沒有意義的-VS無法自動附加或托管Windows服務的唯一方法是通過svchost.exe對它們進行外殼處理)。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.