首页 新闻 赞助 找找看

C# windows 停止服务时有问题

0
悬赏园豆:5 [已解决问题] 解决于 2016-04-20 16:00

只有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()

{

//执行数据库 增删改数据量比较大

}

mkj小陈的主页 mkj小陈 | 初学一级 | 园豆:6
提问于:2015-05-19 09:33
< >
分享
最佳答案
0

问题不是停止服务,而是你的数据库增删改如何停。

实在不行你就重启电脑吧,呵呵。

收获园豆:1
爱编程的大叔 | 高人七级 |园豆:30839 | 2015-05-19 09:43

对的,应该是数据库没有停止,然后服务就无法停止,有没有解决的方法呢?

mkj小陈 | 园豆:6 (初学一级) | 2015-05-19 09:44
其他回答(5)
0

试试将 IsBackground 设置为 true。

protected override void OnStart(string[] args)
{
    if (_mainthread == null)
    {
        _mainthread = new Thread(SaveAllFan);
    }
    _mainthread.IsBackground = true;
    _mainthread.Start();
}
收获园豆:1
dudu | 园豆:31075 (高人七级) | 2015-05-19 09:59
0

增加一个服务关闭的标识和一个 event ,在 SaveAllFan 中检查是否需要停止服务,如果要的话,就不继续执行代码,而是 setevent(event),然后 return,这样 _mainthread 线程就安全退出了。在 OnStop() 中先设置标识为关闭,然后 wait for event.

收获园豆:1
Launcher | 园豆:45045 (高人七级) | 2015-05-19 10:59

谢谢,不过不会啊,刚接触windows服务。

支持(0) 反对(0) mkj小陈 | 园豆:6 (初学一级) | 2015-05-19 11:02

@mkj小陈: 如果你只是刚接触 windows 服务,那么你不可能不会,你之所以不会的原因,不是你刚接触 windows 服务,而是刚接触多线程编程或者刚接触编程。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2015-05-19 11:08

@mkj小陈: 你这个问题可以简单的抽象为在 OnStart 方法中启动了一个执行长时间任务的线程,如何在 OnStop 方法中安全的结束线程并在规定时间内返回。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2015-05-19 11:10

@Launcher: 对的,没搞过多线程

支持(0) 反对(0) mkj小陈 | 园豆:6 (初学一级) | 2015-05-19 11:12

@Launcher:数据量大啊,几分钟执行数据库增删改 有几万条数据吧,说不定 ,在执行数据库的时候,刚好手动停止服务,然后就出错了,服务也就蹦掉了。不知道怎么处理 

支持(0) 反对(0) mkj小陈 | 园豆:6 (初学一级) | 2015-05-19 11:14

@mkj小陈: 我现在有个方法,你告诉我如何让这个方法返回?

void Run()

{

    while(true)

   {

        SqlConnection c>

           conn.exec();

    } 

}

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2015-05-19 11:21

@Launcher: 不知道啊

支持(0) 反对(0) mkj小陈 | 园豆:6 (初学一级) | 2015-05-19 11:23

@田麦成: 额。我这是几分钟执行一次,需要从别的服务器提取数据,所有才用服务的。

支持(0) 反对(0) mkj小陈 | 园豆:6 (初学一级) | 2015-05-19 11:27

@田麦成: 没用过这啊。timer?

支持(0) 反对(0) mkj小陈 | 园豆:6 (初学一级) | 2015-05-19 11:33
0

installutil /u windowsServiceTest.exe --删除服务(当服务启动时第一次执行是禁用服务,第二次执行才删除服务)

收获园豆:1
✎﹏ℳ๓₯㎕ღ | 园豆:1499 (小虾三级) | 2015-05-19 11:51

哦,谢谢,我试试理解下

支持(0) 反对(0) mkj小陈 | 园豆:6 (初学一级) | 2015-05-19 11:52
0

_mainthread.Abort(); 改为_mainthread.Close();试试看看

收获园豆:1
想要飞 | 园豆:11 (初学一级) | 2015-05-19 17:08
0

唯一的办法,就是在SaveAllFan中判断是否需要停止,然后安全退出。。。

_mainthread.Abort();这个是要等待线程执行释放资源才能终止的。

dongger | 园豆:9 (初学一级) | 2015-05-29 22:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册