首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TopShelf服务未启动

TopShelf服务未启动
EN

Stack Overflow用户
提问于 2018-08-12 19:21:05
回答 1查看 4.2K关注 0票数 0

我有一个.NET控制台应用程序,它使用TopShelf作为windows服务运行这个应用程序。控制台应用程序本身在运行和执行它应该做的事情时没有问题。我安装了TopShelf nuget包,并正确配置了TopShelf (据我所知)。

当我调试应用程序时,甚至在我将应用程序安装到Windows并启动该服务之后,它似乎没有执行"DoUpdate“方法,而是定义了要在运行事件中执行的计时器。但这是不可能的。有什么线索吗?

以下是控制台应用程序中的主要方法:

代码语言:javascript
复制
    public static void Main()
    {
        try
        {
            HostFactory.Run(x =>
           {
               x.Service<DNSUpdateTopShelf>(a =>
              {
                  a.ConstructUsing(n => new DNSUpdateTopShelf());
                  a.WhenStarted(ts => ts.Start());
                  a.WhenStopped(ts => ts.Stop());
              });
               x.SetDescription("Update GoDaddy DNS Records");
               x.SetDisplayName("GoDaddy DNS Updater");
               x.SetServiceName("GoDaddyDNSUpdate");
               //x.RunAsNetworkService();
               x.RunAsLocalSystem();
               x.StartAutomatically();
           });
        }
        catch (Exception e)
        {
            System.Console.WriteLine(e.Message);
        }
        System.Console.WriteLine("---------------");
        System.Console.ReadKey();
    }

下面是做这项工作的班级:

代码语言:javascript
复制
public class DNSUpdateTopShelf
{
    private System.Timers.Timer updateTimer;
    private int interval;
    private EventLog log;

    public DNSUpdateTopShelf()
    {
        Initialize();
    }

    public void Initialize()
    {
        //log = new EventLog("DynaProLogs");
        updateTimer = new System.Timers.Timer();
    }

    public void Start()
    {
        try
        {
            Utils.WriteLog("In Start Method");

            var jsonFile = $"{Directory.GetCurrentDirectory()}\\appconfig.json";

            using (StreamReader r = new StreamReader(jsonFile))
            {
                var json = r.ReadToEndAsync().Result;
                var config = (JObject)JsonConvert.DeserializeObject(json);
                interval = config["interval"].Value<int>();
            }

            updateTimer.Interval = interval;
            updateTimer.Elapsed += new ElapsedEventHandler(DoUpdate);
        }
        catch (Exception ex)
        {
            Utils.WriteLog($"DNSUpdater - {ex.Message}", type: EventLogEntryType.Error);
            throw;
        }
    }

    public void Stop()
    {
        Utils.WriteLog("In Stop Method");
        updateTimer.Stop();
    }

    public void DoUpdate(object sender, ElapsedEventArgs e)
    {
        Utils.WriteLog("In DoUpdate method");

        DNSUpdater updater = new DNSUpdater();

        var results = Task.Run( async () => await updater.UpdateAllDomainIPAsync()).Result;
        //var results = updater.UpdateAllDomainIPAsync().Result;

        foreach (UpdateResult result in results)
        {
            Utils.WriteLog($"{result.RequestURI} -- {result.Message}");
        }
    }
}

问题是: DoWork方法永远不会被调用。我已经将计时器的ElapsedTime更改为许多不同的持续时间。但它似乎从来没有被召唤过。

我可以确认定时器对象的"Interval“属性确实被设置了。我还可以确认此服务已安装在Windows中并正在运行。正如我所说的,我尝试通过调试整个应用程序(包括TopShelf )以及构建和安装它作为一个服务来测试它。我不知道为什么计时器运行事件处理程序(DoUpdate)没有触发。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-16 14:54:26

在辛苦地搜索了一个答案之后,我终于得到了答案。如果其他人也有同样的问题,下面是我所做的。我在计时器对象上丢失了几个设置。在Start()方法中,我设置了AutoReset并启用了timer对象的属性。通过这种修改,它现在触发了ElapsedTime事件,并且应用程序按预期工作。

以下是我修改的代码:

代码语言:javascript
复制
            updateTimer.Elapsed += new ElapsedEventHandler(DoUpdate);
            updateTimer.AutoReset = true;
            updateTimer.Enabled = true;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51812099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档