C# Windows Service Thread.isBackground=true过早终止应用程序
我正在尝试创建一个windows服务,它定期从db查询数据,并根据数据执行任务。 我使用了线程,下面的代码在我运行它之后立即终止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
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();