0

いくつかのサービスがあり、スレッドを使用してそれぞれを実装しています。サービスは順次実行されます。デモ用に 1 つだけ取り上げてみましょう。

            services[1] = new RProcessing() { ConsoleInfoColor = ConsoleColor.Cyan };
            success = services[1].Start();
            if (success)
            {
                OutputUtils.WriteLogInfo("Service " + services[1].Name + " started...");
            }
            else
            {
                OutputUtils.WriteLogInfo("Service " + services[1].Name + " failed to start...");
                previousStartup = false;
                services[0].Stop();
            }

RProcessing の内部。

    public RProcessing()
    {
        worker = new Thread[1]; // Only one thread
        for (int i = 0; i < 1; i++)
        {
            worker[i] = new Thread(new ThreadStart(ServiceLoop));
            worker[i].Name = "R Thread_" + i.ToString();
        }
        // processing
    }
    public bool Start()
    {
        foreach (Thread t in worker)
            t.Start();
        return (true);
    }

    public bool Stop()
    {
        if (_isRunning)
        {
            _isRunning = false;
        }
        _isRunning = false;
        base.Dispose();
        WriteLogInfo("Shutdown of R Processor complete");
        return (true);
    }

    public void ServiceLoop()
    {
        _isRunning = true;
        WriteLogInfo("Starting ServiceLoop() for: " + Assembly.GetAssembly(typeof(RProcessing)).FullName);
        string s;
        while (_isRunning)
        {
            Thread.Sleep(500);
            s = null;
            try
            { 
                WriteLogInfo(" processing "+s);
                Thread.Sleep(864);// 24 hours.
            }
            catch (Exception ex)
            {
                WriteLogError("Thread " + Thread.CurrentThread.Name + "     " + ex.ToString());
            }

        }
        if (this._isRunning)
        {
            WriteLogInfo("Restarting thread due to failure...");
            try
            {
                Thread.CurrentThread.Start();
            }
            catch (Exception ex)
            {
                WriteLogError("Error restarting thread... " + ex.ToString());
            }
        }
    }

スレッドが 1 つしかないので、それを終了して次のサービスに戻りたいです。ただし、常に ServiceLoop 内にあります。どのようにそれを破ることができますか?Stop() を呼び出すだけですか?

4

1 に答える 1

0

まあ、コメントは誤解を招くものです。スレッドは 24 時間ではなく、864 ミリ秒スリープします。

Thread.Sleep(864);// 24 hours.

ループ内でそれだけ長くスリープするつもりなら、ManualResetEvent を使用して、いつでも待機を中止できるようにします。

ManualResetEvent cancelEvent;

in loop:
 if(cancelEvent.WaitOne(TimeSpan.FromHours(24))){
    break;
 }

and, in Stop method:
 cancelEvent.Set();

それも削除します:

if (this._isRunning)
{
    WriteLogInfo("Restarting thread due to failure...");
    try
    {
        Thread.CurrentThread.Start();
    }
    catch (Exception ex)
    {
        WriteLogError("Error restarting thread... " + ex.ToString());
    }
}

_isRunning が揮発性であることを確認してください。そうしないと、キャッシュされて別のスレッドで更新されない可能性があります。Stop() を呼び出すと、サービスは平和的に終了します。

于 2013-03-18T18:15:12.670 に答える