Всем привет.
Создал службу, на 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) {
...
Так а как тогда его читать ???
нашел проблему, и она как всегда банальная проблема с путем к файлу xml, когда заменил путь на xDoc.Load("C:/list.xml")
- начало работать ... почему так? да потому что у сервиса WorkDir = C:/Windows/System32/ и соответственно оно и файлик ищет там же...
Но на этом все не закончилось!!!
Что бы динамически подтягивать файл xml, я начал запускать сервис с параметрами, в качестве параметра начал кормить путь к этому xml.В итоге получилось вот так. запуск сервиса со стороны внешнего (основного) интерфейса (тк у меня есть прога в которой просто кнопки и набор статического ф-ла, а сервис мне нужен для автоматизации этого ф-ла, и соответственно сервис запускается через этот интерфейс), в общем кусочек кода - вот:
public static void StartService(string serviceName, int timeoutMilliseconds)
{
ServiceController service = new ServiceController(serviceName);
try {
TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
service.Start({Path.GetFullPath("list.xml")});
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
} catch {
// ...
logger.Error("[WinService] -> TASK START");
}
}
а в самом сервисе метод onStart() принимет переменное число параметров т.о. получилось вот так:
protected override void OnStart(string[] args)
{
logger.Trace("[WinService] -> service onSTART");
AddLog("start");
Task.Run(() => Foo(args[0]));
}
Остальной код приведен выше в определении проблемы
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
У меня есть картинка для экрана игры, но она с полями (счет, уровень и тп)
Нужно сделать сброс dataGridView1 в начальное состояние, те удалить все строки и вставить новые изначальные
Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах