Слияние кода завершено, страница обновится автоматически
using log4net;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using Topshelf;
namespace OUK.ReportDataMonitor
{
public class WinService
{
ILog logger = LogManager.GetLogger(typeof(WinService));
System.Threading.CancellationTokenSource cts;
Task task = null;
OPCReadAuto opcClient = null;
public WinService()
{
}
public static void Startup()
{
HostFactory.Run(x =>
{
x.Service<WinService>(s =>
{
s.ConstructUsing(name => new WinService());
s.WhenStarted(tc => tc.Start());
s.WhenStopped(tc => tc.Stop());
});
x.RunAsLocalSystem();
x.SetDescription("万达茂OPC数据采集服务");
x.SetDisplayName("OUKReportDataMonitor");
x.SetServiceName("OUKReportDataMonitor");
});
}
public void Start()
{
MQAppender.Initialize();
cts = new System.Threading.CancellationTokenSource();
var intervalSeconds = int.Parse(ConfigurationManager.AppSettings["IntervalSeconds"] ?? "30");
opcClient = new OPCReadAuto("127.0.0.1", ConfigurationManager.AppSettings["OPCServer"]);
List<IDataCollector> collectors = new List<IDataCollector>() {
new MeterDataCollector(opcClient),
new InverterDataCollector(opcClient),
new SingleDataCollector(opcClient),
};
task = Task.Run(() =>
{
while (!cts.Token.IsCancellationRequested)
{
foreach (var collector in collectors)
{
Retry(() =>
{
if (cts.Token.IsCancellationRequested)
{
opcClient.Dispose();
logger.Info("正在停止采集服务。");
return;
}
if (!collector.ConnectToServer())
{
logger.Error("OPC服务器链接失败");
}
collector.Collect();
}, 10);
Task.Delay(1000 * intervalSeconds).Wait();
}
}
opcClient.Dispose();
}, cts.Token);
}
public void Retry(Action act, int tryTimes)
{
for (int i = 0; i < tryTimes; i++)
{
try
{
act();
break;
}
catch (Exception ex)
{
logger.Error("数据采集异常", ex);
if (i < tryTimes - 1)
{
logger.Error($"30秒后将第{i + 1}次重试");
Task.Delay(1000 * 30).Wait();
if (ex is COMException || ex.InnerException is COMException)
{
opcClient?.Dispose();
opcClient = new OPCReadAuto("127.0.0.1", ConfigurationManager.AppSettings["OPCServer"]);
}
}
}
}
}
public void Stop()
{
cts.Cancel();
if (!task.Wait(40000))
{
logger.Error("停止服务超时。");
}
MQAppender.Cleanup();
}
}
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )