private void ReadModule(ref List <BsonDocument> Datastreams, ref long ReqTime, Action <int, dynamic> Callback, IPlc PLC) { long TimeStamp = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds; LogObject logObj; Stopwatch watch = new Stopwatch(); foreach (BsonDocument Stream in Datastreams) { Stream["oldTime"] = 0; } Callback(1, Datastreams); watch.Start(); long Req = 0; while (true) { Callback(0, null); TimeStamp = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds; watch.Restart(); foreach (BsonDocument Stream in Datastreams) { try { if (BsonResolver.Resolve(Stream["Active"]) && BsonResolver.Resolve(Stream["Interval"]) <= TimeStamp - BsonResolver.Resolve(Stream["oldTime"])) { byte[] buffer = GetBuffer(BsonResolver.Resolve(Stream["DataType"])); PLC.Read(Stream, ref buffer); logObj = new LogObject(); logObj.PLC = BsonResolver.Resolve(PLC.ClientDetails["id"].ToString()); logObj.Datastream = BsonResolver.Resolve(Stream["Collection"]) + "_" + BsonResolver.Resolve(Stream["id"]); logObj.Value = buffer; logObj._ts = TimeStamp; logObj.DataType = BsonResolver.Resolve(Stream["DataType"]); logObj.Position = BsonResolver.Resolve(Stream["Position"]); Queue.Enqueue(logObj); Stream["oldTime"] = TimeStamp; } } catch { PLC.Disconnect(); while (!PLC.Connect()) { Thread.Sleep(1000); } } } Req = watch.ElapsedMilliseconds; if (Req > 0) { ReqTime = Req; } } }