I'm currently working in C# with version 2017.1 of QuickOPC and i have observed strange behaviors.
When compiling my program in 32 bit, i have no memory leak and no handle leak everything seems to work find.
When compiling my program in 64 bit, i'm observing that my memory consumption is growing and my handles are growing too.
My program is only doing some tags subscriptions and some direct readings.
Code:
class DataManager:IDisposable
{
public delegate void NMessage(string Msg);
public event NMessage NouveauMessage;
public delegate void NValeur(string Msg);
public event NValeur NouvelleValeur;
private string sMessage = "";
private EasyDAClient opcClient = null;
private int[] handles = null;
private List<DAItemGroupArguments> ArgumentsList = new List<DAItemGroupArguments>();
public void Init()
{
sMessage = "Chargement des variables depuis le fichier XML ...";
if (NouveauMessage != null)
{
NouveauMessage(sMessage);
}
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.Random", 300, 1));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.Ramp (10 min)", 1000, 2));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.Ramp (1 min)", 500, 3));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.Ramp (10 s)", 500, 4));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.Ramp (1 s)", 300, 5));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.Ramp 0:100 (10 min)", 1000, 6));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.Ramp 0:100 (1 min)", 500, 7));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.Ramp 0:100 (10 s)", 500, 8));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.Ramp 0:100 (1 s)", 300, 9));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.Ramp 0:360 (10 min)", 1000, 10));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.Ramp 0:360(1 min)", 300, 11));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.Ramp 0:360 (10 s)", 1000, 12));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.Ramp 0:360 (1 s)", 500, 13));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.OnOff (10 min)", 500, 14));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.OnOff (1 min)", 300, 15));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.OnOff (10 s)", 1000, 16));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.OnOff (1 s)", 500, 17));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.Incrementing (10 min)", 500, 18));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.Incrementing (1 min)", 300, 19));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.Incrementing (10 s)", 1000, 20));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Simulation.Incrementing (1 s)", 300, 21));
ArgumentsList.Add(new DAItemGroupArguments("", "OPCLabs.KitServer.2", "Demo.Ramp", 1000, 22));
sMessage = "Chargement des variables terminé.";
if (NouveauMessage != null)
{
NouveauMessage(sMessage);
}
}
public void Start()
{
if(opcClient == null)
{
if(ArgumentsList == null)
{
Init();
}
opcClient = new EasyDAClient();
opcClient.Isolated = true;
handles = opcClient.SubscribeMultipleItems(ArgumentsList.ToArray(), OnItemChanged);
}
}
public void Stop()
{
if (opcClient != null)
{
opcClient.UnsubscribeMultipleItems(handles);
opcClient.Dispose();
opcClient = null;
ArgumentsList = null;
}
sMessage = "...";
if (NouveauMessage != null)
{
NouveauMessage(sMessage);
}
}
private void OnItemChanged(object sender, EasyDAItemChangedEventArgs eventArgs)
{
string Msg = "";
if (eventArgs.Vtq.HasValue)
{
Msg = string.Format("DT = {0} / ID = {1} / Val = {2} / Qualité = {3}",
eventArgs.Vtq.Timestamp,
eventArgs.Arguments.ItemDescriptor.ItemId,
eventArgs.Vtq.DisplayValue(),
eventArgs.Vtq.Quality.ToString()
);
if (NouvelleValeur != null)
{
NouvelleValeur(Msg);
}
}
}
public string Lecture(string sTag)
{
string sRet = "";
if (opcClient != null)
{
sRet = opcClient.ReadItemValue("OPCLabs.KitServer.2", new DAItemDescriptor(sTag)).ToString();
}
return sRet;
}
public string GetHandles()
{
string sRet = "";
if (opcClient != null)
{
sRet = handles.Length.ToString();
}
return sRet;
}
public void Dispose()
{
throw new NotImplementedException();
}
}