只有5分了哦。分数用完了哦帮帮忙
问题:
1、停止服务数据还在运行 ,然后停止服务报错,服务也不能启动了,卸载都卸不掉。只有结束进程,搞了好久才能把服务卸载,
2、停止服务怎样写呢,有没有解决的办法呢?
3、能正常启动、停止服务就行了。
private Thread _mainthread;
public WxInfoService()
{
InitializeComponent();
}
/// <summary>
/// 启动
/// </summary>
/// <param name="args"></param>
protected override void OnStart(string[] args)
{
if (_mainthread == null)
{
_mainthread = new Thread(SaveAllFan);
}
_mainthread.Start();
}
/// <summary>
/// 停止
/// </summary>
protected override void OnStop()
{
while (true)
{
if (_mainthread != null && _mainthread.ThreadState != System.Threading.ThreadState.Running)
{
_mainthread.Abort();
_mainthread = null;
break;
}
Thread.Sleep(500);
}
}
public void SaveAllFan()
{
//执行数据库 增删改数据量比较大
}
问题不是停止服务,而是你的数据库增删改如何停。
实在不行你就重启电脑吧,呵呵。
对的,应该是数据库没有停止,然后服务就无法停止,有没有解决的方法呢?
试试将 IsBackground 设置为 true。
protected override void OnStart(string[] args) { if (_mainthread == null) { _mainthread = new Thread(SaveAllFan); } _mainthread.IsBackground = true; _mainthread.Start(); }
增加一个服务关闭的标识和一个 event ,在 SaveAllFan 中检查是否需要停止服务,如果要的话,就不继续执行代码,而是 setevent(event),然后 return,这样 _mainthread 线程就安全退出了。在 OnStop() 中先设置标识为关闭,然后 wait for event.
谢谢,不过不会啊,刚接触windows服务。
@mkj小陈: 如果你只是刚接触 windows 服务,那么你不可能不会,你之所以不会的原因,不是你刚接触 windows 服务,而是刚接触多线程编程或者刚接触编程。
@mkj小陈: 你这个问题可以简单的抽象为在 OnStart 方法中启动了一个执行长时间任务的线程,如何在 OnStop 方法中安全的结束线程并在规定时间内返回。
@Launcher: 对的,没搞过多线程
@Launcher:数据量大啊,几分钟执行数据库增删改 有几万条数据吧,说不定 ,在执行数据库的时候,刚好手动停止服务,然后就出错了,服务也就蹦掉了。不知道怎么处理
@mkj小陈: 我现在有个方法,你告诉我如何让这个方法返回?
void Run()
{
while(true)
{
SqlConnection c>
conn.exec();
}
}
@Launcher: 不知道啊
@田麦成: 额。我这是几分钟执行一次,需要从别的服务器提取数据,所有才用服务的。
@田麦成: 没用过这啊。timer?
installutil /u windowsServiceTest.exe --删除服务(当服务启动时第一次执行是禁用服务,第二次执行才删除服务)
哦,谢谢,我试试理解下
_mainthread.Abort(); 改为_mainthread.Close();试试看看
唯一的办法,就是在SaveAllFan中判断是否需要停止,然后安全退出。。。
_mainthread.Abort();这个是要等待线程执行释放资源才能终止的。