Connectivity Software User's Guide and Reference
DisposableLockPublishing Method
Example 



OpcLabs.EasySparkplug Assembly > OpcLabs.EasySparkplug Namespace > ISparkplugProducerExtension Class : DisposableLockPublishing Method
The Sparkplug producer that will perform the operation.

The value of this parameter cannot be null (Nothing in Visual Basic).

Locks the publishing of metric data changes and returns an object that unlocks the publishing upon its disposal.
Syntax
'Declaration
 
<ExtensionAttribute()>
<JetBrains.Annotations.NotNullAttribute()>
Public Shared Function DisposableLockPublishing( _
   ByVal producer As ISparkplugProducer _
) As IDisposable
'Usage
 
Dim producer As ISparkplugProducer
Dim value As IDisposable
 
value = ISparkplugProducerExtension.DisposableLockPublishing(producer)
[Extension()]
[JetBrains.Annotations.NotNull()]
public static IDisposable DisposableLockPublishing( 
   ISparkplugProducer producer
)
[Extension()]
[JetBrains.Annotations.NotNull()]
public:
static IDisposable^ DisposableLockPublishing( 
   ISparkplugProducer^ producer
) 

Parameters

producer
The Sparkplug producer that will perform the operation.

The value of this parameter cannot be null (Nothing in Visual Basic).

Return Value

Returns the producer, internally modified as defined by the method.

This method never returns null (Nothing in Visual Basic).

Exceptions
ExceptionDescription

A null reference (Nothing in Visual Basic) is passed to a method that does not accept it as a valid argument.

This is a usage error, i.e. it will never occur (the exception will not be thrown) in a correctly written program. Your code should not catch this exception.

Remarks

This is an extension method (info: C#, VB.NET). In languages that have support for extensions methods (such as C# and VB.NET), you can use the extension method as if it were a regular method on the object that is its first parameter. In other languages (such as with Python.NET), you will call the extension as a static method, and pass it the object on which it acts as its first parameter.

 

Sparkplug is a trademark of Eclipse Foundation, Inc. "MQTT" is a trademark of the OASIS Open standards consortium. Other related terms are trademarks of their respective owners. Any use of these terms on this site is for descriptive purposes only and does not imply any sponsorship, endorsement or affiliation.

Example
// This example shows how to lock the publishing and obtain a disposable object which unlocks the publishing
// when it is disposed.
//
// You can use any Sparkplug application, including our SparkplugCmd utility and the SparkplugApplicationConsoleDemo
// program, to subscribe to the edge node data.
//
// Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-ConnectivityStudio/Latest/examples.html .
// Sparkplug examples in C# on GitHub: https://github.com/OPCLabs/Examples-ConnectivityStudio-CSharp .
// Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
// a commercial license in order to use Online Forums, and we reply to every post.

using System;
using System.Threading;
using OpcLabs.EasySparkplug;
using Timer = System.Timers.Timer;

namespace SparkplugDocExamples.EdgeNode._EasySparkplugEdgeNode
{
     class DisposableLockPublishing
    {
        static public void Main1()
        {
            // Note that the default port for the "mqtt" scheme is 1883.
            var hostDescriptor = new SparkplugHostDescriptor("mqtt://localhost");

            // Instantiate the edge node object.
            var edgeNode = new EasySparkplugEdgeNode(hostDescriptor, "easyGroup", "easySparkplugDemo");

            // Configure the edge node so that we will publish data fully manually.
            edgeNode.PublishingInterval = Timeout.Infinite;
            edgeNode.ReportByException = true;
            
            // Hook the SystemConnectionStateChanged event to handle system connection state changes.
            edgeNode.SystemConnectionStateChanged += (sender, eventArgs) =>
            {
                // Display the new connection state (such as when the connection to the broker succeeds or fails).
                Console.WriteLine($"{nameof(EasySparkplugEdgeNode.SystemConnectionStateChanged)}: {eventArgs}");
            };

            // Define metrics.
            var random = new Random();
            SparkplugMetric myMetric1 = SparkplugMetric.CreateIn(edgeNode, "MyMetric1").ValueType<int>();
            SparkplugMetric myMetric2 = SparkplugMetric.CreateIn(edgeNode, "MyMetric2").ValueType<int>();
            SparkplugMetric myMetric3 = SparkplugMetric.CreateIn(edgeNode, "MyMetric3").ValueType<int>();

            // Start the edge node.
            Console.WriteLine("The edge node is starting...");
            edgeNode.Start();

            Console.WriteLine("The edge node is started.");
            Console.WriteLine();

            // Create a timer for publishing the data, and start it.
            var timer = new Timer { AutoReset = true };
            timer.Elapsed += (sender, eventArgs) =>
            {
                // Lock/unlock the publishing so that we can make multiple updates without them being published immediately.
                using (edgeNode.DisposableLockPublishing())
                {
                    // Update some of the metrics (in this example, with random data).
                    if (random.Next(2) != 0)
                        myMetric1.UpdateReadData(random.Next());
                    if (random.Next(2) != 0)
                        myMetric2.UpdateReadData(random.Next());
                    if (random.Next(2) != 0)
                        myMetric3.UpdateReadData(random.Next());

                    // Upon leaving the 'using' block, the publishing will be unlocked, and any updated data published.
                }

                // Set the next interval to a random value between 0 and 3 seconds.
                timer.Interval = random.Next(3 * 1000); 
            };
            timer.Start();
            
            // Let the user decide when to stop.
            Console.WriteLine("Press Enter to stop the edge node...");
            Console.ReadLine();
            
            // Stop the timer.
            timer.Stop();

            // Stop the edge node.
            Console.WriteLine("The edge node is stopping...");
            edgeNode.Stop();

            Console.WriteLine("The edge node is stopped.");
        }
    }
}
' This example shows how to lock the publishing and obtain a disposable object which unlocks the publishing
' when it is disposed.
'
' You can use any Sparkplug application, including our SparkplugCmd utility and the SparkplugApplicationConsoleDemo
' program, to subscribe to the edge node data.
'
' Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-ConnectivityStudio/Latest/examples.html .
' Sparkplug examples in C# on GitHub: https://github.com/OPCLabs/Examples-ConnectivityStudio-CSharp .
' Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
' a commercial license in order to use Online Forums, and we reply to every post.

Imports System.Threading
Imports OpcLabs.EasySparkplug
Imports Timer = System.Timers.Timer

Namespace Global.SparkplugDocExamples.EdgeNode._EasySparkplugEdgeNode
    Class DisposableLockPublishing
        Public Shared Sub Main1()
            ' Note that the default port for the "mqtt" scheme is 1883.
            Dim hostDescriptor = New SparkplugHostDescriptor("mqtt://localhost")

            ' Instantiate the edge node object.
            Dim edgeNode = New EasySparkplugEdgeNode(hostDescriptor, "easyGroup", "easySparkplugDemo")

            ' Configure the edge node so that we will publish data fully manually.
            edgeNode.PublishingInterval = Timeout.Infinite
            edgeNode.ReportByException = True

            ' Hook the SystemConnectionStateChanged event to handle system connection state changes.
            AddHandler edgeNode.SystemConnectionStateChanged,
                Sub(sender, eventArgs)
                    ' Display the new connection state (such as when the connection to the broker succeeds or fails).
                    Console.WriteLine($"{NameOf(EasySparkplugEdgeNode.SystemConnectionStateChanged)}: {eventArgs}")
                End Sub

            ' Define metrics.
            Dim random = New Random()
            Dim myMetric1 As SparkplugMetric = SparkplugMetric.CreateIn(edgeNode, "MyMetric1").ValueType(Of Integer)()
            Dim myMetric2 As SparkplugMetric = SparkplugMetric.CreateIn(edgeNode, "MyMetric2").ValueType(Of Integer)()
            Dim myMetric3 As SparkplugMetric = SparkplugMetric.CreateIn(edgeNode, "MyMetric3").ValueType(Of Integer)()

            ' Start the edge node.
            Console.WriteLine("The edge node is starting...")
            edgeNode.Start()

            Console.WriteLine("The edge node is started.")
            Console.WriteLine()

            ' Create a timer for publishing the data, and start it.
            Dim timer = New Timer() With {.AutoReset = True}
            AddHandler timer.Elapsed,
                Sub(sender, eventArgs)
                    ' Lock/unlock the publishing so that we can make multiple updates without them being published immediately.
                    Using edgeNode.DisposableLockPublishing()
                        ' Update some of the metrics (in this example, with random data).
                        If (random.Next(2) <> 0) Then
                            myMetric1.UpdateReadData(random.Next())
                        End If
                        If (random.Next(2) <> 0) Then
                            myMetric2.UpdateReadData(random.Next())
                        End If
                        If (random.Next(2) <> 0) Then
                            myMetric3.UpdateReadData(random.Next())
                        End If

                        ' Upon leaving the 'using' block, the publishing will be unlocked, and any updated data published.
                    End Using

                    ' Set the next interval to a random value between 0 and 3 seconds.
                    timer.Interval = random.Next(3 * 1000)
                End Sub
            timer.Start()

            ' Let the user decide when to stop.
            Console.WriteLine("Press Enter to stop the edge node...")
            Console.ReadLine()

            ' Stop the timer.
            timer.Stop()

            ' Stop the edge node.
            Console.WriteLine("The edge node is stopping...")
            edgeNode.Stop()

            Console.WriteLine("The edge node is stopped.")
        End Sub
    End Class
End Namespace
Requirements

Target Platforms: .NET Framework: Windows 10 (selected versions), Windows 11 (selected versions), Windows Server 2016, Windows Server 2022; .NET: Linux, macOS, Microsoft Windows

See Also