【问题标题】:how to start window services automatically while it is stopped by c#如何在被c#停止时自动启动窗口服务
【发布时间】:2015-06-01 11:57:11
【问题描述】:

我创建了一个窗口服务,当它检测到我的数据库有变化时它会停止。

问题:如何通过 C# 编码在 5 或 10 秒后停止窗口服务后再次启动?

    private static string connectString = ConfigurationManager.ConnectionStrings['ConnStr'].ToString();

    int sql_depend = 0;//stop

    private delegate void GridDelegate(DataTable table);
    private SqlDependency dep;

    public Watcher()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        SqlDependency.Start(connectString);
        sql_depend = 1;
        UpdateGrid();

        string file = @"E:\WatcherLogFile\sds.txt";
        TextWriter writer = new StreamWriter(file, true);
        writer.WriteLine("Window services started");
        writer.Close();
    }

    protected override void OnStop()
    {
        string file = @"E:\WatcherLogFile\sds.txt";
        TextWriter writer = new StreamWriter(file, true);
        writer.WriteLine("Window services stopped");
        writer.Close();

    }

    //sql dependency check
    private void UpdateGrid()
    {
        string sql = "select [Name], [ClientName] from [Account]";
        DataTable dt = new DataTable();
        using (SqlConnection cn = new SqlConnection(connectString))
        {
            using (SqlCommand cmd = new SqlCommand(sql, cn))
            {
                cn.Open();
                dep = new SqlDependency(cmd);
                dep.OnChange += new OnChangeEventHandler(dep_OnChange);
                using (SqlDataReader rdr = cmd.ExecuteReader())
                {
                    dt.Load(rdr);
                }
            }
        }
    }

    //sql dependency detect changes 
    void dep_OnChange(object sender, SqlNotificationEventArgs e)
    {
        ServiceController myService = new ServiceController();
        myService.ServiceName = "Watcher";
        myService.Stop();
        SqlDependency.Stop(connectString);
        sql_depend = 0;
    }
  • 可以是 onStop() 中的循环函数吗?我希望它每天手动启动一次,然后自动启动/停止。

【问题讨论】:

  • 你为什么要阻止它?为什么不简单地让它暂停它正在做的事情呢?您不能从自身内部重新启动服务器,当它停止时,没有代码正在执行。
  • 我是新手,也许我的逻辑是错误的,嗯,如何暂停并重新开始?可以循环吗?
  • 好吧,问题是,你还在等什么?你在等什么?
  • 我的窗口服务用于检测我在数据库中的一张表上的任何更改。一旦它检测到变化,它就会停止,然后提醒我,然后我需要它重新启动以再次运行该过程。
  • 它如何提醒您?再说一遍,它还在等什么?是否在等待您确认警报?我知道现在它“等待”您启动服务。你想要它等待什么?您可以描述您想要的流程,而不是您拥有的流程?

标签: c#


【解决方案1】:

你可以试试这个。

var sc = new ServiceController(YouServiceNameString);
// stop service
// sc.Stop();

//start service
sc.Start();

// or restart
/*
if (sc.Status.Equals(ServiceControllerStatus.Running))
{
    sc.Stop();
    sc.WaitForStatus(ServiceControllerStatus.Stopped);
 }
 sc.Start();
 sc.WaitForStatus(ServiceControllerStatus.Running);
 */

如果要暂停,请使用 Thread.Sleep 或此示例

var _stopToken = new CancellationTokenSource();
// call this when you want stop
// _stopToken.Cancel();

// there is you can set timeout
_stopToken.Token.WaitHandle.WaitOne(YourWaitTime);

// if you want circle
// while (!_stopToken.IsCancellationRequested)
// { /*...do somthing...*/ }

【讨论】:

    【解决方案2】:

    您有多种选择来解决您的问题。

    最简单的解决方案是为服务失败配置 recovery 操作。

    查看link 了解详细说明。

    另一个选项我可以考虑编写您的自定义脚本/程序以在您发现失败时重新启动它。

    【讨论】:

    • 嗨,我试过这个,它不会按照我设置的时间重新开始
    • 有报错吗?或者只是服务没有启动?如果您提供您已经尝试过的确切内容,将很难回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 2011-12-27
    • 2013-06-10
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多