public OpcGroup AddGroup(string groupName) { OpcGroup _group = new OpcGroup { IsActive = true, Name = groupName, UpdateRate = new TimeSpan(0, 0, 0, 0, _options.DefaultMonitorInterval) }; var subItem = new OpcDa.SubscriptionState { Name = (++_sub).ToString(CultureInfo.InvariantCulture), Active = true, UpdateRate = DefaultMonitorInterval }; var sub = _server.CreateSubscription(subItem); Action unsubscribe = () => new Thread(o => _server.CancelSubscription(sub)).Start(); dic.Add(groupName, sub); sub.DataChanged += (subscriptionHandle, requestHandle, values) => { List <OpcItemValue> items = new List <OpcItemValue>(); foreach (OpcDa.ItemValueResult value in values) { OpcItemValue item = new OpcItemValue { GroupName = groupName, Value = value.Value, ItemId = value.ItemName, Quality = value.Quality.ToString(), Timestamp = value.Timestamp }; items.Add(item); } _group.SendValue(items); }; return(_group); }