1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/hehuolong_admin-OPCReport

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
WinService.cs 3.9 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
hehuolong Отправлено 5 лет назад 0fd936b
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 )

Вы можете оставить комментарий после Вход в систему

1
https://gitlife.ru/oschina-mirror/hehuolong_admin-OPCReport.git
git@gitlife.ru:oschina-mirror/hehuolong_admin-OPCReport.git
oschina-mirror
hehuolong_admin-OPCReport
hehuolong_admin-OPCReport
master