From 98cbfa75e1f3257a473b5feb9c8ee412569dd0f7 Mon Sep 17 00:00:00 2001 From: Roman Ettlinger Date: Fri, 2 May 2025 16:44:10 +0200 Subject: [PATCH 1/4] fix Sampling Group disposing m_shutdownEvent in Shutdown Method. Fix double call of Shutdown Method --- Libraries/Opc.Ua.Server/NodeManager/SamplingGroup.cs | 3 ++- Libraries/Opc.Ua.Server/NodeManager/SamplingGroupManager.cs | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Libraries/Opc.Ua.Server/NodeManager/SamplingGroup.cs b/Libraries/Opc.Ua.Server/NodeManager/SamplingGroup.cs index 77230f3649..a1bfa4ad99 100644 --- a/Libraries/Opc.Ua.Server/NodeManager/SamplingGroup.cs +++ b/Libraries/Opc.Ua.Server/NodeManager/SamplingGroup.cs @@ -100,6 +100,8 @@ protected virtual void Dispose(bool disposing) { m_shutdownEvent.Set(); m_samplingRates.Clear(); + Utils.SilentDispose(m_shutdownEvent); + Utils.SilentDispose(m_samplingTask); } } } @@ -132,7 +134,6 @@ public void Shutdown() m_items.Clear(); Utils.SilentDispose(m_samplingTask); m_samplingTask = null; - Utils.SilentDispose(m_shutdownEvent); } } diff --git a/Libraries/Opc.Ua.Server/NodeManager/SamplingGroupManager.cs b/Libraries/Opc.Ua.Server/NodeManager/SamplingGroupManager.cs index 591ad22a19..ad6428c30f 100644 --- a/Libraries/Opc.Ua.Server/NodeManager/SamplingGroupManager.cs +++ b/Libraries/Opc.Ua.Server/NodeManager/SamplingGroupManager.cs @@ -506,7 +506,6 @@ public virtual void ApplyChanges() // remove unused groups. foreach (SamplingGroup samplingGroup in unusedGroups) { - samplingGroup.Shutdown(); m_samplingGroups.Remove(samplingGroup); } } From 837453d1de5d4887d24d45439fe83288777a88a4 Mon Sep 17 00:00:00 2001 From: Roman Ettlinger Date: Sun, 18 May 2025 18:40:13 +0200 Subject: [PATCH 2/4] Dont dispose running task, will be cleaned up by GC once shutdown event is reached --- Libraries/Opc.Ua.Server/NodeManager/SamplingGroup.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Libraries/Opc.Ua.Server/NodeManager/SamplingGroup.cs b/Libraries/Opc.Ua.Server/NodeManager/SamplingGroup.cs index a1bfa4ad99..8c21826abd 100644 --- a/Libraries/Opc.Ua.Server/NodeManager/SamplingGroup.cs +++ b/Libraries/Opc.Ua.Server/NodeManager/SamplingGroup.cs @@ -132,7 +132,6 @@ public void Shutdown() { m_shutdownEvent.Set(); m_items.Clear(); - Utils.SilentDispose(m_samplingTask); m_samplingTask = null; } } From 1a50cf2f019ed5d026d1b288433e04373567762d Mon Sep 17 00:00:00 2001 From: Roman Ettlinger Date: Sun, 18 May 2025 19:27:14 +0200 Subject: [PATCH 3/4] Remove disposal of shutdown event that is needed to stop the task gracefully --- Libraries/Opc.Ua.Server/NodeManager/SamplingGroup.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Libraries/Opc.Ua.Server/NodeManager/SamplingGroup.cs b/Libraries/Opc.Ua.Server/NodeManager/SamplingGroup.cs index 8c21826abd..3420360f48 100644 --- a/Libraries/Opc.Ua.Server/NodeManager/SamplingGroup.cs +++ b/Libraries/Opc.Ua.Server/NodeManager/SamplingGroup.cs @@ -100,8 +100,6 @@ protected virtual void Dispose(bool disposing) { m_shutdownEvent.Set(); m_samplingRates.Clear(); - Utils.SilentDispose(m_shutdownEvent); - Utils.SilentDispose(m_samplingTask); } } } From 4b7adeed4ca57c343db7acf777780e3c0cb8826c Mon Sep 17 00:00:00 2001 From: Roman Ettlinger Date: Sun, 18 May 2025 19:36:25 +0200 Subject: [PATCH 4/4] Ensure graceful dispose --- Libraries/Opc.Ua.Server/NodeManager/SamplingGroup.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Libraries/Opc.Ua.Server/NodeManager/SamplingGroup.cs b/Libraries/Opc.Ua.Server/NodeManager/SamplingGroup.cs index 3420360f48..132e66166f 100644 --- a/Libraries/Opc.Ua.Server/NodeManager/SamplingGroup.cs +++ b/Libraries/Opc.Ua.Server/NodeManager/SamplingGroup.cs @@ -101,6 +101,18 @@ protected virtual void Dispose(bool disposing) m_shutdownEvent.Set(); m_samplingRates.Clear(); } + + if (m_samplingTask != null) + { + try + { + m_samplingTask.Wait(); + } + catch (AggregateException) { /* Ignore exceptions on shutdown */ } + } + + Utils.SilentDispose(m_samplingTask); + Utils.SilentDispose(m_shutdownEvent); } } #endregion