Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.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# Windows Service Thread.isBackground=true过早终止应用程序_C#_Multithreading - Fatal编程技术网

C# Windows Service Thread.isBackground=true过早终止应用程序

C# Windows Service Thread.isBackground=true过早终止应用程序,c#,multithreading,C#,Multithreading,我正在尝试创建一个windows服务,它定期从db查询数据,并根据数据执行任务。 我使用了线程,下面的代码在我运行它之后立即终止 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Te

我正在尝试创建一个windows服务,它定期从db查询数据,并根据数据执行任务。 我使用了线程,下面的代码在我运行它之后立即终止

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace MESUDeleteService
{
    public partial class MESDeleteService : ServiceBase
    {
        AutoResetEvent StopRequest = new AutoResetEvent(false);
        private Thread _thread;

        public MESDeleteService()
        {
            InitializeComponent();
        }

        public void startConsole()
        {
            OnStart(null);
        }

        protected override void OnStart(string[] args)
        {
            MESUDeleteService.Core.Logger.Writelog.Info("Deletion Service Start");
            _thread = new Thread(WorkerThreadFunc);
            _thread.IsBackground = true;
            _thread.Start();
        }

        public void WorkerThreadFunc()
        {
            for (; ; )
            {
                if (StopRequest.WaitOne(10000)) return;
                try
                {
                    SNDX.DataAccess.UnitOfWork uow = new SNDX.DataAccess.UnitOfWork();

                    var deleteOrderCollection = uow.DeleteSettingsRepository
                        .Get()
                        .Where(m => m.STATUS == "ACTIVE" && m.NEXTRUN != null)
                        .Where(n => n.NEXTRUN.Value.ToString("{0:yyyyMMddHHmm}") == DateTime.Now.ToString("{0:yyyyMMddHHmm}"))
                        .ToList<SNDX.DataAccess.SND_DELETE_SETTINGS>();

                    if (deleteOrderCollection.Count > 0)
                    {
                        MESUDeleteService.Core.Logger.Writelog.Info("There'r new Delete Orders");

                        //process each delete orders
                        foreach (SNDX.DataAccess.SND_DELETE_SETTINGS x in deleteOrderCollection)
                        {
                            MESUDeleteService.Core.Logger.Writelog.Info("Delete Type : " + x.SETTINGS);
                            MESUDeleteService.Core.DeleteOrder deleteOrder = new MESUDeleteService.Core.DeleteOrder();
                            deleteOrder.Settings = x.SETTINGS;
                            deleteOrder.SearchPattern = x.SEARCHPATTERN;
                            deleteOrder.NetworkPath = x.NETWORKPATH;
                            deleteOrder.EmailList = x.EMAILLIST;
                            deleteOrder.ID = x.ID;
                            deleteOrder.LastRun = DateTime.Now;
                            deleteOrder.WeekRun = x.WEEKRUN;
                            deleteOrder.ComputerName = x.COMPUTERNAME;
                            deleteOrder.DomainName = x.DOMAINNAME;
                            deleteOrder.ADAccount = x.ADACCOUNT;
                            deleteOrder.ADPassword = x.ADPASSWORD;

                            //by having them in a thread.                            
                            Thread t = new Thread(new ThreadStart(deleteOrder.ThreadStart)) { IsBackground = true };
                            t.IsBackground = true;
                            MESUDeleteService.Core.Logger.Writelog.Info("Delete Thread Starting Type");
                            t.Start();
                        }
                    }
                    uow.Dispose();
                }
                catch (Exception ex)
                {
                    MESUDeleteService.Core.Logger.Writelog.Error(ex.Message);
                }
            }
        }

        protected override void OnStop()
        {
            StopRequest.Set();
            _thread.Join();
        }
    }
 }

如何优化此代码?

IsBackground与线程使用的CPU功率无关。后台线程和前台线程之间的唯一区别是,如果所有其他前台线程都已退出,后台线程不会停止进程关闭。您正是按下了“关闭此进程”的按钮,如果您阅读了以下内容,您会发现该按钮会非常清楚地显示出来:后台线程与前台线程相同,只是后台线程不阻止进程终止I removed isbackground并让它成为前台。。但是,CPU消耗是分配给它的核心的100%。。是什么导致它达到100%?好吧,我想问一下,为每次删除分离一个线程是否明智——如果您只是按顺序运行每次删除,它会做什么?您是否考虑过使用任务或线程池而不是创建更多的线程?还可以考虑将线程更改为BelowNormal或最低值,然后如果在计算机上没有什么有用的东西,那么它们只会使用100% CPU。
 SNDX.DataAccess.UnitOfWork uow = new SNDX.DataAccess.UnitOfWork();