From 1feedd43f439bc4fda7ec71a9d88d01fe7d75848 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Thu, 21 May 2026 19:33:58 +0200 Subject: [PATCH] Ancora riorganizzazione servizi --- IOB-UT-NEXT/IOB-UT-NEXT.csproj | 12 +-- .../Core/SingleThreadTaskScheduler.cs | 92 +++++++++++++++++++ .../Monitoring}/CallMetricsCollector.cs | 2 +- .../Services/{Core => Utility}/BitUtils.cs | 2 +- .../Utility}/IntConditionCheck.cs | 2 +- .../{ => Services/Utility}/MeasureUtils.cs | 6 +- .../{ => Services/Utility}/TimeUtils.cs | 2 +- IOB-UT-NEXT/SingleThreadTaskScheduler.cs | 47 ---------- IOB-UT-NEXT/baseUtils.cs | 1 + IOB-WIN-FORM/AdapterForm.cs | 1 + IOB-WIN-FORM/Iob/Generic.cs | 4 +- IOB-WIN-FTP/Iob/Ftp.cs | 1 + IOB-WIN-MBUS/IobModbustTCP/ModbusTCP.cs | 1 + 13 files changed, 110 insertions(+), 63 deletions(-) create mode 100644 IOB-UT-NEXT/Services/Core/SingleThreadTaskScheduler.cs rename IOB-UT-NEXT/{ => Services/Monitoring}/CallMetricsCollector.cs (99%) rename IOB-UT-NEXT/Services/{Core => Utility}/BitUtils.cs (93%) rename IOB-UT-NEXT/{ => Services/Utility}/IntConditionCheck.cs (98%) rename IOB-UT-NEXT/{ => Services/Utility}/MeasureUtils.cs (93%) rename IOB-UT-NEXT/{ => Services/Utility}/TimeUtils.cs (90%) delete mode 100644 IOB-UT-NEXT/SingleThreadTaskScheduler.cs diff --git a/IOB-UT-NEXT/IOB-UT-NEXT.csproj b/IOB-UT-NEXT/IOB-UT-NEXT.csproj index 8a4cbaed..ea3f7698 100644 --- a/IOB-UT-NEXT/IOB-UT-NEXT.csproj +++ b/IOB-UT-NEXT/IOB-UT-NEXT.csproj @@ -157,9 +157,9 @@ - + - + @@ -195,7 +195,7 @@ - + @@ -207,13 +207,13 @@ - + - + - + diff --git a/IOB-UT-NEXT/Services/Core/SingleThreadTaskScheduler.cs b/IOB-UT-NEXT/Services/Core/SingleThreadTaskScheduler.cs new file mode 100644 index 00000000..ac4b7528 --- /dev/null +++ b/IOB-UT-NEXT/Services/Core/SingleThreadTaskScheduler.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.Collections.Concurrent; +using System.Threading; +using System.Threading.Tasks; + +namespace IOB_UT_NEXT.Services.Core +{ + public class SingleThreadTaskScheduler : TaskScheduler, IDisposable + { + #region Public Constructors + + public SingleThreadTaskScheduler(string threadName) + { + var tcs = new TaskCompletionSource(); + _thread = new Thread(() => + { + // Creiamo il contesto di sincronizzazione personalizzato + SyncContext = new SingleThreadSynchronizationContext(this); + SynchronizationContext.SetSynchronizationContext(SyncContext); + tcs.SetResult(true); + + foreach (var task in _tasks.GetConsumingEnumerable()) + { + base.TryExecuteTask(task); + } + }) + { IsBackground = true, Name = threadName }; + _thread.Start(); + tcs.Task.Wait(); // Aspetta che il thread sia pronto col suo contesto + } + + #endregion Public Constructors + + #region Public Properties + + public override int MaximumConcurrencyLevel => 1; + public SynchronizationContext SyncContext { get; private set; } + + #endregion Public Properties + + #region Public Methods + + public void Dispose() => _tasks.CompleteAdding(); + + #endregion Public Methods + + #region Protected Methods + + protected override IEnumerable GetScheduledTasks() => _tasks; + + protected override void QueueTask(Task task) => _tasks.Add(task); + + protected override bool TryExecuteTaskInline(Task task, bool prev) + => Thread.CurrentThread == _thread && base.TryExecuteTask(task); + + #endregion Protected Methods + + #region Private Fields + + private readonly BlockingCollection _tasks = new BlockingCollection(); + private readonly Thread _thread; + + #endregion Private Fields + + #region Private Classes + + private class SingleThreadSynchronizationContext : SynchronizationContext + { + #region Public Constructors + + public SingleThreadSynchronizationContext(SingleThreadTaskScheduler sch) => _sch = sch; + + #endregion Public Constructors + + #region Public Methods + + public override void Post(SendOrPostCallback d, object state) + => Task.Factory.StartNew(() => d(state), CancellationToken.None, TaskCreationOptions.None, _sch); + + #endregion Public Methods + + #region Private Fields + + private readonly SingleThreadTaskScheduler _sch; + + #endregion Private Fields + } + + #endregion Private Classes + } +} \ No newline at end of file diff --git a/IOB-UT-NEXT/CallMetricsCollector.cs b/IOB-UT-NEXT/Services/Monitoring/CallMetricsCollector.cs similarity index 99% rename from IOB-UT-NEXT/CallMetricsCollector.cs rename to IOB-UT-NEXT/Services/Monitoring/CallMetricsCollector.cs index 6b5891e1..e161cf5f 100644 --- a/IOB-UT-NEXT/CallMetricsCollector.cs +++ b/IOB-UT-NEXT/Services/Monitoring/CallMetricsCollector.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -namespace IOB_UT_NEXT +namespace IOB_UT_NEXT.Services.Monitoring { public static class CallMetricsCollector { diff --git a/IOB-UT-NEXT/Services/Core/BitUtils.cs b/IOB-UT-NEXT/Services/Utility/BitUtils.cs similarity index 93% rename from IOB-UT-NEXT/Services/Core/BitUtils.cs rename to IOB-UT-NEXT/Services/Utility/BitUtils.cs index fe3ff7ee..ccb7ef7f 100644 --- a/IOB-UT-NEXT/Services/Core/BitUtils.cs +++ b/IOB-UT-NEXT/Services/Utility/BitUtils.cs @@ -1,4 +1,4 @@ -namespace IOB_UT_NEXT.Services.Core +namespace IOB_UT_NEXT.Services.Utility { public class BitUtils { diff --git a/IOB-UT-NEXT/IntConditionCheck.cs b/IOB-UT-NEXT/Services/Utility/IntConditionCheck.cs similarity index 98% rename from IOB-UT-NEXT/IntConditionCheck.cs rename to IOB-UT-NEXT/Services/Utility/IntConditionCheck.cs index 3d305482..8f400fe0 100644 --- a/IOB-UT-NEXT/IntConditionCheck.cs +++ b/IOB-UT-NEXT/Services/Utility/IntConditionCheck.cs @@ -1,4 +1,4 @@ -namespace IOB_UT_NEXT +namespace IOB_UT_NEXT.Services.Utility { public class IntConditionCheck { diff --git a/IOB-UT-NEXT/MeasureUtils.cs b/IOB-UT-NEXT/Services/Utility/MeasureUtils.cs similarity index 93% rename from IOB-UT-NEXT/MeasureUtils.cs rename to IOB-UT-NEXT/Services/Utility/MeasureUtils.cs index bd7bf830..951302f3 100644 --- a/IOB-UT-NEXT/MeasureUtils.cs +++ b/IOB-UT-NEXT/Services/Utility/MeasureUtils.cs @@ -1,10 +1,6 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -namespace IOB_UT_NEXT +namespace IOB_UT_NEXT.Services.Utility { public class MeasureUtils { diff --git a/IOB-UT-NEXT/TimeUtils.cs b/IOB-UT-NEXT/Services/Utility/TimeUtils.cs similarity index 90% rename from IOB-UT-NEXT/TimeUtils.cs rename to IOB-UT-NEXT/Services/Utility/TimeUtils.cs index c46e0744..509706f3 100644 --- a/IOB-UT-NEXT/TimeUtils.cs +++ b/IOB-UT-NEXT/Services/Utility/TimeUtils.cs @@ -1,6 +1,6 @@ using System; -namespace IOB_UT_NEXT +namespace IOB_UT_NEXT.Services.Utility { public class TimeUtils { diff --git a/IOB-UT-NEXT/SingleThreadTaskScheduler.cs b/IOB-UT-NEXT/SingleThreadTaskScheduler.cs deleted file mode 100644 index 7c70f915..00000000 --- a/IOB-UT-NEXT/SingleThreadTaskScheduler.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.Concurrent; -using System.Threading; -using System.Threading.Tasks; - -public class SingleThreadTaskScheduler : TaskScheduler, IDisposable -{ - private readonly BlockingCollection _tasks = new BlockingCollection(); - private readonly Thread _thread; - public SynchronizationContext SyncContext { get; private set; } - - public SingleThreadTaskScheduler(string threadName) - { - var tcs = new TaskCompletionSource(); - _thread = new Thread(() => - { - // Creiamo il contesto di sincronizzazione personalizzato - SyncContext = new SingleThreadSynchronizationContext(this); - SynchronizationContext.SetSynchronizationContext(SyncContext); - tcs.SetResult(true); - - foreach (var task in _tasks.GetConsumingEnumerable()) - { - base.TryExecuteTask(task); - } - }) - { IsBackground = true, Name = threadName }; - _thread.Start(); - tcs.Task.Wait(); // Aspetta che il thread sia pronto col suo contesto - } - - private class SingleThreadSynchronizationContext : SynchronizationContext - { - private readonly SingleThreadTaskScheduler _sch; - public SingleThreadSynchronizationContext(SingleThreadTaskScheduler sch) => _sch = sch; - public override void Post(SendOrPostCallback d, object state) - => Task.Factory.StartNew(() => d(state), CancellationToken.None, TaskCreationOptions.None, _sch); - } - - protected override void QueueTask(Task task) => _tasks.Add(task); - protected override bool TryExecuteTaskInline(Task task, bool prev) - => Thread.CurrentThread == _thread && base.TryExecuteTask(task); - protected override IEnumerable GetScheduledTasks() => _tasks; - public override int MaximumConcurrencyLevel => 1; - public void Dispose() => _tasks.CompleteAdding(); -} \ No newline at end of file diff --git a/IOB-UT-NEXT/baseUtils.cs b/IOB-UT-NEXT/baseUtils.cs index 8cc20d8e..eec5c16c 100644 --- a/IOB-UT-NEXT/baseUtils.cs +++ b/IOB-UT-NEXT/baseUtils.cs @@ -1,5 +1,6 @@ using IOB_UT_NEXT.Services.Core; using IOB_UT_NEXT.Services.Files; +using IOB_UT_NEXT.Services.Monitoring; using NLog; using RestSharp; using System; diff --git a/IOB-WIN-FORM/AdapterForm.cs b/IOB-WIN-FORM/AdapterForm.cs index 86189112..594f2ab3 100644 --- a/IOB-WIN-FORM/AdapterForm.cs +++ b/IOB-WIN-FORM/AdapterForm.cs @@ -3,6 +3,7 @@ using IOB_UT_NEXT.Config; using IOB_UT_NEXT.Config.Base; using IOB_UT_NEXT.Services.Core; using IOB_UT_NEXT.Services.Files; +using IOB_UT_NEXT.Services.Monitoring; using IOB_UT_NEXT.Services.Networking; using MapoSDK; using Newtonsoft.Json; diff --git a/IOB-WIN-FORM/Iob/Generic.cs b/IOB-WIN-FORM/Iob/Generic.cs index 312d1cf3..e303c497 100644 --- a/IOB-WIN-FORM/Iob/Generic.cs +++ b/IOB-WIN-FORM/Iob/Generic.cs @@ -6,7 +6,9 @@ using IOB_UT_NEXT.Services.Cache; using IOB_UT_NEXT.Services.Core; using IOB_UT_NEXT.Services.Data; using IOB_UT_NEXT.Services.Files; +using IOB_UT_NEXT.Services.Monitoring; using IOB_UT_NEXT.Services.Networking; +using IOB_UT_NEXT.Services.Utility; using MapoSDK; using MathNet.Numerics.Statistics; using Newtonsoft.Json; @@ -9529,7 +9531,7 @@ namespace IOB_WIN_FORM.Iob foreach (var rawJob in listaValori) { // deserializzo... - JobTaskData jobTask = JsonConvert.DeserializeObject(rawJob); + JobTaskData jobTask = JsonDeserialize(rawJob); // ora chiamo la cancellazione dei task eseguiti... var taskDict = JobTaskData.TaskDict(jobTask.RawData); foreach (var item in taskDict) diff --git a/IOB-WIN-FTP/Iob/Ftp.cs b/IOB-WIN-FTP/Iob/Ftp.cs index 220d8f76..b8de9248 100644 --- a/IOB-WIN-FTP/Iob/Ftp.cs +++ b/IOB-WIN-FTP/Iob/Ftp.cs @@ -4,6 +4,7 @@ using IOB_UT_NEXT.Config; using IOB_UT_NEXT.Config.Mem; using IOB_UT_NEXT.Config.Special; using IOB_UT_NEXT.Services.Data; +using IOB_UT_NEXT.Services.Utility; using MapoSDK; using Newtonsoft.Json; using System; diff --git a/IOB-WIN-MBUS/IobModbustTCP/ModbusTCP.cs b/IOB-WIN-MBUS/IobModbustTCP/ModbusTCP.cs index 43617c13..cdac1693 100644 --- a/IOB-WIN-MBUS/IobModbustTCP/ModbusTCP.cs +++ b/IOB-WIN-MBUS/IobModbustTCP/ModbusTCP.cs @@ -3,6 +3,7 @@ using IOB_UT_NEXT; using IOB_UT_NEXT.Config; using IOB_UT_NEXT.Config.Mem; using IOB_UT_NEXT.Services.Core; +using IOB_UT_NEXT.Services.Utility; using MapoSDK; using Newtonsoft.Json; using System;