大家好。
在 C# 中创建了一个服务(我并不特别......),它应该一路读取 *.xml 并执行任务。
启动服务崩溃时出现问题 - 我认为这是由于读取 xml。没有它,服务将正常启动并运行。这是一个示例代码:
namespace Backup1cSrvInstaller
{
public class WinServiceInstaller2 : ServiceBase
{
private static Logger logger = LogManager.GetCurrentClassLogger();
const string MyServiceName = "Backup1C";
public WinServiceInstaller2()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.ServiceName = MyServiceName;
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
}
protected override void OnStart(string[] args)
{
logger.Trace("[WinService] -> service onSTART");
Task.Run(() => Foo(10));
}
protected override void OnStop()
{
logger.Trace("[WinService] -> service onSTOP");
}
async void Foo(int taskCount) {
int delay = 10000;
//AppService appSrv = new AppService();
DataService dataSrv = new DataService();
while (true) {
logger.Info("[WinServiceInstaller] -> TASK START [***** Starting new block *****]");
List<Data> datas = dataSrv.readXml();
/*
DateTime dt = new DateTime();
foreach(Data data in datas){
logger.Info("[WinServiceInstaller] -> For-1");
Schedule sc = data.ScheduleObj;
for(int i=0; i<sc.Days.Count; i++){
logger.Info("[WinServiceInstaller] -> For-2");
if(dt.DayOfWeek.Equals(sc.Days[i])){
logger.Info("[WinServiceInstaller] -> IF-1");
for(int j=0; j<sc.Times.Count; j++){
logger.Info("[WinServiceInstaller] -> For-3");
//DateTime dt2 = DateTime.Parse(sc.Times[j].);
if(dt < sc.Times[j]){
logger.Info("[WinServiceInstaller] -> IF-2");
logger.Info("[TASK] -> TASK START -> ID: " + data.Id + ", Name: " + data.ShortName);
}
}
}
}
}
*/
/*
for (int i = 0; i < taskCount; i++) {
int index = i;
await Run(delay, index);
}
*/
}
}
async Task Run(int delay, int taskIndex) {
//Console.WriteLine("Do some operation, index is: {0}", taskIndex);
logger.Info("Do some operation, index is: " + taskIndex);
await Task.Delay(delay);
}
}
一般来说,这就是问题所在。一般来说,xml 是可读的,也许。它被另一个程序的主界面读取。他想提交一个带有任务的服务......
但我确定这与 xml 读取方法有关...
我是这样读的(这可能是问题所在)
...
XmlDocument xDoc = new XmlDocument();
xDoc.Load(fileName);
XmlElement xRoot = xDoc.DocumentElement;
foreach (XmlElement xnode in xRoot) {
...
那你怎么读呢?
我发现了一个问题,与往常一样,当我将路径替换为
xDoc.Load("C:/list.xml")
- 它开始工作时,xml 文件的路径仍然是一个平庸的问题……为什么会这样?是的,因为该服务具有 WorkDir = C:/Windows/System32/ 并且因此它会在同一个位置查找文件...但它并没有就此结束!!!
为了动态拉取xml文件,我开始带参数运行服务,作为参数我开始输入这个xml的路径,结果变成了这样。从外部(主)界面一侧启动服务(也许我有一个程序,其中只有按钮和一组静态 f-la,我需要服务来自动化这个 f-la,因此服务是通过这个接口启动的),一般来说就是一段代码——这里:
因此,在服务本身中,onStart() 方法将采用可变数量的参数。结果是这样的:
其余代码在上面的问题定义中给出