1

onstop()が呼び出されたときに処理を終了して終了することを確認する必要があるWebサービスがあります。現在、onstop()が呼び出されると、サービスはすぐに停止します。ManualResetEventとrequeststopフラグを確認するように言われました。私はどこでも例を探しましたが、これらのいくつかを見つけました:

Windowsサービスで実行されているC#.NETスレッドを安全に停止するにはどうすればよいですか?

ManualResetEventまたはThread.Sleep()のいずれかを選択するには

http://www.codeproject.com/Articles/19370/Windows-Services-Made-Simple

しかし、私は自分の状況に最もよく当てはまるものを理解するのに非常に苦労しています。

以下のコード:

        System.Timers.Timer timer = new System.Timers.Timer();
        private volatile bool _requestStop = false;
        private static readonly string connStr = ConfigurationManager.ConnectionStrings["bedbankstandssConnectionString"].ConnectionString;
        private readonly ManualResetEvent _allDoneEvt = new ManualResetEvent(true);
        public InvService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            _requestStop = false;
            timer.Elapsed += timer_Elapsed;
            double pollingInterval = Convert.ToDouble(ConfigurationManager.AppSettings["PollingInterval"]);
            timer.Interval = pollingInterval;
            timer.Enabled = true;
            timer.Start();      
        }

        protected override void OnStop()
        {
            _requestStop = true;
            timer.Dispose();
        }

        protected override void OnContinue()
        { }

        protected override void OnPause()
        { }

        private void timer_Elapsed(object sender, EventArgs e)
        {
            if (!_requestStop)
            {
                timer.Start(); 
                InvProcessingChanges();     
            }               
        }

        private void InvProcessingChanges()
        { 
           //Processes changes to inventory
        }

私を助けることができるWindowsサービスの経験がある人はいますか?私は、最初の作業サービスを完了したばかりのWindowsサービスにまったく慣れていません。このサービスは、実際に停止する前に、インベントリの更新の送信を完了する必要があります。

4

1 に答える 1

3

ManualResetEvent完了する前に、イベントがシグナル状態になるまで待機するようなものを使用できますStopManualResetEventSlim同じプロセス内でシグナルを送ろうとしていることを考えると、より適切かもしれません。

基本的Waitに、停止中および呼び出しの処理中にイベントを呼び出すことができReset、完了したら呼び出しますSet

例えば

private ManualResetEventSlim resetEvent = new ManualResetEventSlim(false);

public void InvProcessingChanges()
{
    resetEventSlim.Reset();
    try
    {
        // TODO: *the* processing
    }
    finally
    {
        resetEvent.Set();
    }
}

public void WaitUntilProcessingComplete()
{
    resetEvent.Wait();
}

そしてあなたのサービスに応じて:

    protected override void OnStop()
    {
        WaitUntilProcessingComplete();
    }
于 2013-02-19T03:52:44.517 に答える