2012-08-03 25 views
2

我試圖在Windows服務中使用Rx擴展,並且卡住了。我發現的樣本不起作用。我將用一些代碼解釋我想實現的目標。我創建的第一個類實際上是類做所有的工作:在Windows服務中使用Rx

class Worker : IDisposable { 
    public Worker() { 
    } 

    private void Run() { 
    } 

    public void Dispose() { 
    } 
} 

我想在OnStart中創建一個實例,並殺死它調用OnStop:

public partial class MyService : ServiceBase { 
    private Worker _Worker; 

    public MyService() { 
     InitializeComponent(); 
    } 

    protected override void OnStart (string[] args) { 
     _Worker = new Worker(); 
    } 

    protected override void OnStop() { 
     _Worker.Dispose(); 
     _Worker = null; 
    } 
} 

所以我去這樣做在Worker的構造函數中:

/* _TimesEvents and _Events are class level variables */ 
_TimedEvents = Observable.Timer (TimeSpan.FromSeconds (1), new EventLoopScheduler()).Timestamp(); 
_Events = (from events in _TimedEvents select events).Subscribe (e => Run()); 

在Dispose中,我只是在處理_Events。運行被調用一次。我會懷疑它每秒都會被調用,或者根本沒有。

我錯過了什麼?

編輯:

爲了測試我Main()看起來是這樣的:

static void Main () { 
    var args = Environment.GetCommandLineArgs(); 
    if (null != args && args.Length > 0) { 
     using (BRWorker worker = new BRWorker() ) { 
      System.Windows.Forms.MessageBox.Show ("Press ok to quit", "Test", System.Windows.Forms.MessageBoxButtons.OK); 
     } 
    } else { 
     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] 
     { 
      new BRService() 
     }; 
     ServiceBase.Run (ServicesToRun); 
    } 
} 

回答

3

您可能想要使用Observable。 區間http://rxwiki.wikidot.com/101samples#toc14

+0

謝謝。我搜索了一個簡單的解決方案... – Sascha 2012-08-03 13:24:24

+0

我正在嘗試做同樣的事情。你可以發佈或鏈接到一個示例,顯示服務類中的哪些內容? – 2017-07-17 11:23:08

5

Observable.Timer產生值完成後TimeSpan。您想要使用Observable.Interval,它會在之後產生一個新值,每TimeSpan

+0

謝謝。我尋找一個複雜的解決方案,它是一個簡單的... – Sascha 2012-08-03 13:24:15