我有一个.NET控制台应用程序,它使用TopShelf作为windows服务运行这个应用程序。控制台应用程序本身在运行和执行它应该做的事情时没有问题。我安装了TopShelf nuget包,并正确配置了TopShelf (据我所知)。
当我调试应用程序时,甚至在我将应用程序安装到Windows并启动该服务之后,它似乎没有执行"DoUpdate“方法,而是定义了要在运行事件中执行的计时器。但这是不可能的。有什么线索吗?
以下是控制台应用程序中的主要方法:
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();
}下面是做这项工作的班级:
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)没有触发。
发布于 2018-08-16 14:54:26
在辛苦地搜索了一个答案之后,我终于得到了答案。如果其他人也有同样的问题,下面是我所做的。我在计时器对象上丢失了几个设置。在Start()方法中,我设置了AutoReset并启用了timer对象的属性。通过这种修改,它现在触发了ElapsedTime事件,并且应用程序按预期工作。
以下是我修改的代码:
updateTimer.Elapsed += new ElapsedEventHandler(DoUpdate);
updateTimer.AutoReset = true;
updateTimer.Enabled = true;https://stackoverflow.com/questions/51812099
复制相似问题