Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 完成服务并停止线程_C# - Fatal编程技术网

C# 完成服务并停止线程

C# 完成服务并停止线程,c#,C#,我有几个服务,并使用线程来实现每个服务。服务是按顺序执行的。让我拿一个来演示一下 services[1] = new RProcessing() { ConsoleInfoColor = ConsoleColor.Cyan }; success = services[1].Start(); if (success) { OutputUtils.WriteLogInfo(

我有几个服务,并使用线程来实现每个服务。服务是按顺序执行的。让我拿一个来演示一下

            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();
            }
内部处理

    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());
            }
        }
    }
public RProcessing()
{
worker=新线程[1];//只有一个线程
对于(int i=0;i<1;i++)
{
辅助线程[i]=新线程(新线程开始(ServiceLoop));
辅助线程[i].Name=“R线程”+i.ToString();
}
//加工
}
公共bool Start()
{
foreach(螺纹t in辅助线)
t、 Start();
返回(真);
}
公共车站
{
如果(正在运行)
{
_isRunning=false;
}
_isRunning=false;
base.Dispose();
WriteLogInfo(“R处理器关闭完成”);
返回(真);
}
公共void ServiceLoop()
{
_isRunning=true;
WriteLogInfo(“为“+Assembly.GetAssembly(typeof(RProcessing)).FullName”启动ServiceLoop());
字符串s;
当(\u正在运行)
{
睡眠(500);
s=零;
尝试
{ 
WriteLogInfo(“处理”+s);
线程。睡眠(864);//24小时。
}
捕获(例外情况除外)
{
WriteLogError(“线程”+Thread.CurrentThread.Name+“”+ex.ToString());
}
}
如果(此操作正在运行)
{
WriteLogInfo(“由于失败而重新启动线程…”);
尝试
{
Thread.CurrentThread.Start();
}
捕获(例外情况除外)
{
WriteLogError(“重新启动线程时出错…”+ex.ToString());
}
}
}

只有一个线程,我想完成它,然后返回下一个服务。但是,它始终位于ServiceLoop内部。你怎么能打破它?只需调用Stop()?

好吧,评论是误导性的。线程将睡眠864毫秒,而不是24小时

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()时,服务将和平退出

我可以这样做吗?\u isRunning=false;停止();睡眠(86400);Stop已经将_isRunning设置为false,在这之后等待一天又有什么意义呢?我想每天运行该服务,因此等待24小时重新运行该服务以处理更新数据。如果您想很少执行某项操作,我建议您使用windows scheduled task,这将运行一些命令行程序。如果您想在应用程序中执行此操作,则可以使用计时器。我认为没有理由创建一个可以睡一天的线程。