2011-09-29 147 views
0

我是新來的windows服務。我需要一個從數據庫的表中讀取條目的Windows服務。我有一個CONSOLE APP,我添加了新的項目WINDOWS SERVICE。我已經有了訪問數據庫和其他方法的方法。我可以在啓動時讀取數據庫。我在哪裏放線程? ( 我怎樣才能做到這一點)。在WINDOWS服務上,我添加這些方法?我有Windows服務是這樣的:Windows服務+從數據庫中讀取

public Service1() 
{ 
    InitializeComponent(); 
} 

protected override void OnStart(string[] args) 
{ 
    do 
    { 
     thread.start(); 
     bool variab = readFromDatabase (Database table); 
    } 
} 

protected override void OnStop() 
{ 
} 

回答

0

你必須把你的代碼或者類,它包含在OnStart方法數據訪問邏輯

2

我建議你創建在你做一個類你需要的一切,並在服務創建:

public Service1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     YourClass cl = new YourClass(); 
     cl.DoWhatYouNeed(...);  
    } 

    protected override void OnStop() 
    { 
    } 

這給了你機會,也許在調試版本運行和測試類從服務分開。

1

隨着Windows服務通常會創建一個方法來執行服務的主循環,在一個單獨的線程中。否則,該服務可能無響應。例如,您可以擁有一個名爲MainLoop的方法來執行服務邏輯。僅使用OnStart方法執行初始化任務,例如讀取配置值或啓動服務的線程。並使用OnStop執行清潔任務,停止線程等...

Thread _workerThread; 
bool _shouldStop; 

public Service1() 
{ 
    InitializeComponent(); 
}  

protected override void OnStart(string[] args) 
{ 
    try{ 
    _workerThread = new Thread(new ThreadStart(MainLoop)); 
    _shouldStop = false; 
    _workerThread.Start(); 
    } 
    catch{} 
} 

private void MainLoop() 
{ 
    while (!_shouldStop) 
    { 
     try{ 
     //your logic here 
     } 
     catch{} 
    } 
} 

protected override void OnStop() 
{ 
    _shouldStop = true; 
} 
+0

空的catch-blocks(通常)是邪惡的。在OnStart()方法中,它們是特別的。在你的情況下,服務控制管理器會認爲你的服務已經開始,當它可能永遠不能啓動你的「MainLoop」。也許這是,你的意圖,但我會懷疑。 –

+1

它們是空的,因爲它是一個示例,並且該示例的目的不是異常處理。我沒有在這裏寫一個應用程序,只是顯示每種方法的目的。關於MainLoop,OnStart方法的異常處理將決定是否停止服務,所以是的。 –