2

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 を Disposing するだけです。Run は 1 回呼び出されます。毎秒呼び出されているか、まったく呼び出されていないと思われます。

私は何が欠けていますか?

編集:

私の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 );
    }
}
4

2 に答える 2

5

Observable.Timerが完了すると、単一の値が生成されTimeSpanます。ごとObservable.Intervalに新しい値を生成する whichを使用します。 TimeSpan

于 2012-08-03T13:10:48.810 に答える
3

Observable を使用することもできます。間隔( http://rxwiki.wikidot.com/101samples#toc14 )

于 2012-08-03T13:12:43.143 に答える