2012-10-02 61 views
0

我在c#visual studio終極版中創建了一個windows服務。 vs給出了一個模板來使用,但我不確定在哪裏放置我的代碼。有Program.cs的如何使用vs模板格式化Windows服務?

static class Program 
{ 
    static void Main() 
    { 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] 
     { 
      new Service1() 
     }; 
     ServiceBase.Run(ServicesToRun); 
    } 
} 

和service1.cs的示例代碼顯示IM如何格式化但林不知道什麼即時通訊做是正確的。 ive搜索了一下,但無法找到構建我的程序的方式

public partial class Service1 : ServiceBase 
{ 
    Thread thread1; 

    public Service1() 
    { 
     InitializeComponent(); 

     thread1 = new Thread(function); 
     thread1.Start(); 
    } 

    protected override void OnStart(string[] args) 
    { 
    } 

    protected override void OnStop() 
    { 
    } 

    public void function() 
    { 
     while (true) 
     { 
      //keep doing something 
     } 
    } 
} 

我在哪裏調用循環函數?我放置它的位置還是從主位置?

回答

0

礦看起來更像是這樣的:

public partial class Service1 : ServiceBase 
{ 
    Thread thread1; 
    Boolean running = false; 

    public Service1() 
    { 
     InitializeComponent(); 

     thread1 = new Thread(function); 

    } 

    protected override void OnStart(string[] args) 
    { 
     thread1.Start(); 
     running = false; 
    } 

    protected override void OnStop() 
    { 
     running = false; 
     thread1.Stop(); 
    } 

    public void function() 
    { 
     while (running) 
     { 
      //keep doing something 
     } 
    } 
} 
0

從技術上講,沒有什麼錯把function()Service類。在這一點上更多的是設計問題。例如,function()與類中的其他操作類似嗎?我猜不會,因爲其他人涉及類和服務控制管理器(SCM)之間的交互。

但是,有兩個問題與代碼:

  1. 啓動線程處理通信,而不是在構造函數中,因爲這是在服務啓動時。
  2. 包含一些停止功能的方法,如布爾標誌。
0

你應該記住,是的Service1構造函數將被執行,不僅在服務將通過SCM啓動 - 即使你單擊資源管理器服務可執行程序,它會被執行。

這就是爲什麼把任何服務的有效載荷送入構造函數是一個壞主意 - 這是更好地把服務的初始化代碼爲OnStart方法,並終止代碼(如停止工作線程,清理資源) - 爲OnStop方法。

請注意,OnStart/OnStop方法的執行時間非常有限。
如果您打算執行繁重的初始化代碼,請考慮在可能的情況下使用延遲初始化。

另外,考慮使用ThreadPool/TPL代替手動創建線程。