Thread Reporter used with IProgress
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;
[ComVisible(true)]
[Serializable]
[StructLayout(LayoutKind.Sequential)]
public class Reporter
{
public readonly ConcurrentDictionary<string, object> GValues = new ConcurrentDictionary<string, object>();
public List<string> ErrorLog = new List<string>();
public Reporter()
{
}
public Reporter(string DescriptorID)
{
LoadDescriptorFile(DescriptorID);
}
public string ProgramDir
{
get
{
var dir = Services.GetEnvironmentEx("Local AppData") + "\\" + Application.ProductName + "\\";
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
return dir;
}
}
public void SaveDescriptorFile(string DescriptorID)
{
var anx = ProgramDir + DescriptorID + "_file.bin";
var iel = GValues.ToArray();
using (var wrt = new Writer(anx))
{
foreach (var i in iel)
{
wrt.WriteString(i.Key);
wrt.WriteBytes(i.Value.GetBytesObjectSerial());
}
}
}
public void LoadDescriptorFile(string DescriptorID)
{
var anx = ProgramDir + DescriptorID + "_file.bin";
if (!File.Exists(anx))
throw new Exception($"file {anx} does not exist.");
GValues.Clear();
using (var rdr = new Reader(anx))
{
var key = rdr.ReadString();
var value = rdr.ReadBytes();
GValues.TryAdd(key, value);
}
}
public bool DescriptorFileExists(string DescriptorID)
{
var anx = ProgramDir + DescriptorID + "_file.bin";
return File.Exists(anx);
}
public bool CheckDescriptorExists(string DescriptorID)
{
return GValues.ContainsKey(DescriptorID);
}
public void BuildDescriptorList(List<string> lst)
{
foreach (var i in lst)
Set(i, default);
}
public void Set(string DescriptorID, object value)
{
if (!GValues.ContainsKey(DescriptorID))
GValues.TryAdd(DescriptorID, value);
else GValues[DescriptorID] = value;
}
public bool GetBool(string DescriptorID)
{
if (GValues.TryGetValue(DescriptorID, out var ov))
try
{
return Convert.ToBoolean(ov);
}
catch (Exception ex)
{
if (ex.InnerException != null) ErrorLog.Add(ex.InnerException.ToString());
}
return false;
}
public char GetChar(string DescriptorID)
{
if (GValues.TryGetValue(DescriptorID, out var ov))
try
{
return Convert.ToChar(ov);
}
catch (Exception ex)
{
if (ex.InnerException != null) ErrorLog.Add(ex.InnerException.ToString());
}
return ' ';
}
public sbyte GetSByte(string DescriptorID)
{
if (GValues.TryGetValue(DescriptorID, out var ov))
try
{
return Convert.ToSByte(ov);
}
catch (Exception ex)
{
if (ex.InnerException != null) ErrorLog.Add(ex.InnerException.ToString());
}
return 0;
}
public byte GetByte(string DescriptorID)
{
if (GValues.TryGetValue(DescriptorID, out var ov))
try
{
return Convert.ToByte(ov);
}
catch (Exception ex)
{
if (ex.InnerException != null) ErrorLog.Add(ex.InnerException.ToString());
}
return 0;
}
public short GetShort(string DescriptorID)
{
if (GValues.TryGetValue(DescriptorID, out var ov))
try
{
return Convert.ToInt16(ov);
}
catch (Exception ex)
{
if (ex.InnerException != null) ErrorLog.Add(ex.InnerException.ToString());
}
return 0;
}
public ushort GetUShort(string DescriptorID)
{
if (GValues.TryGetValue(DescriptorID, out var ov))
try
{
return Convert.ToUInt16(ov);
}
catch (Exception ex)
{
if (ex.InnerException != null) ErrorLog.Add(ex.InnerException.ToString());
}
return 0;
}
public int GetInt(string DescriptorID)
{
if (GValues.TryGetValue(DescriptorID, out var ov))
try
{
return Convert.ToInt32(ov);
}
catch (Exception ex)
{
if (ex.InnerException != null) ErrorLog.Add(ex.InnerException.ToString());
}
return 0;
}
public uint GetUInt(string DescriptorID)
{
if (GValues.TryGetValue(DescriptorID, out var ov))
try
{
return Convert.ToUInt32(ov);
}
catch (Exception ex)
{
if (ex.InnerException != null) ErrorLog.Add(ex.InnerException.ToString());
}
return 0;
}
public long GetLong(string DescriptorID)
{
if (GValues.TryGetValue(DescriptorID, out var ov))
try
{
return Convert.ToInt64(ov);
}
catch (Exception ex)
{
if (ex.InnerException != null) ErrorLog.Add(ex.InnerException.ToString());
}
return 0;
}
public ulong GetULong(string DescriptorID)
{
if (GValues.TryGetValue(DescriptorID, out var ov))
try
{
return Convert.ToUInt64(ov);
}
catch (Exception ex)
{
if (ex.InnerException != null) ErrorLog.Add(ex.InnerException.ToString());
}
return 0;
}
public float GetFloat(string DescriptorID)
{
if (GValues.TryGetValue(DescriptorID, out var ov))
try
{
return Convert.ToSingle(ov);
}
catch (Exception ex)
{
if (ex.InnerException != null) ErrorLog.Add(ex.InnerException.ToString());
}
return 0;
}
public double GetDouble(string DescriptorID)
{
if (GValues.TryGetValue(DescriptorID, out var ov))
try
{
return Convert.ToDouble(ov);
}
catch (Exception ex)
{
if (ex.InnerException != null) ErrorLog.Add(ex.InnerException.ToString());
}
return 0;
}
public decimal GetDecimal(string DescriptorID)
{
if (GValues.TryGetValue(DescriptorID, out var ov))
try
{
return Convert.ToDecimal(ov);
}
catch (Exception ex)
{
if (ex.InnerException != null) ErrorLog.Add(ex.InnerException.ToString());
}
return 0;
}
public string GetString(string DescriptorID)
{
if (GValues.TryGetValue(DescriptorID, out var ov))
try
{
return Convert.ToString(ov);
}
catch (Exception ex)
{
if (ex.InnerException != null) ErrorLog.Add(ex.InnerException.ToString());
}
return " ";
}
public DateTime GetDateTime(string DescriptorID)
{
if (GValues.TryGetValue(DescriptorID, out var ov))
try
{
return Convert.ToDateTime(ov);
}
catch (Exception ex)
{
if (ex.InnerException != null) ErrorLog.Add(ex.InnerException.ToString());
}
return default;
}
}