/// <summary> /// 获取MessageContext,如果不存在,返回null /// 这个方法的更重要意义在于操作TM队列,及时移除过期信息,并将最新活动的对象移到尾部 /// </summary> /// <param name="userName">用户名(OpenId)</param> /// <returns></returns> private TM GetMessageContext(string userName) { //检查并移除过期记录,为了尽量节约资源,这里暂不使用独立线程轮询 while (MessageQueue.Count > 0) { var firstMessageContext = MessageQueue[0]; var timeSpan = DateTime.Now - firstMessageContext.LastActiveTime; if (timeSpan.TotalMinutes >= ExpireMinutes) { MessageQueue.RemoveAt(0); //从队列中移除过期对象 MessageCollection.Remove(firstMessageContext.UserName); //从集合中删除过期对象 //添加事件回调 firstMessageContext.OnRemoved();//TODO:此处异步处理,或用户在自己操作的时候异步处理需要耗费时间比较长的操作。 } else { break; } } /* * 全局只有在这里用到MessageCollection.ContainsKey * 充分分离MessageCollection内部操作, * 为以后变化或扩展MessageCollection留余地 */ if (!MessageCollection.ContainsKey(userName)) { return(null); } return(MessageCollection[userName]); }
private static void SendMessage(SenderObjectRelation senderObjectRelation) { Application.Current.Dispatcher.Invoke(delegate { if (senderObjectRelation.Group == null) { if (!MessageCollection.ContainsKey(senderObjectRelation.SenderId)) { MessageCollection.Add(senderObjectRelation.SenderId, new ObservableCollection <Message>()); } User friend = Friends.SingleOrDefault(f => f.Id == senderObjectRelation.SenderId); MessageCollection[senderObjectRelation.SenderId].Add((Message)senderObjectRelation.Data); IncomingText?.Invoke(senderObjectRelation); } else { Group group = Group.groups.SingleOrDefault(g => g.Id == senderObjectRelation.DestinationId); User friend = Friends.SingleOrDefault(f => f.Id == senderObjectRelation.SenderId); if (friend == null) { friend = new User(senderObjectRelation.SenderId); } group.Messages.Add(new Message(friend, senderObjectRelation.Data.ToString(), DateTime.Now)); IncomingText?.Invoke(senderObjectRelation, group); } }); }
public void Message() { Service service = Connect(); MessageCollection messageCollection = service.GetMessages(); if (messageCollection.ContainsKey("sdk-test-message1")) { messageCollection.Remove("sdk-test-message1"); } Assert.IsFalse(messageCollection.ContainsKey("sdk-test-message1"), this.assertRoot + "#1"); if (messageCollection.ContainsKey("sdk-test-message2")) { messageCollection.Remove("sdk-test-message2"); } Assert.IsFalse(messageCollection.ContainsKey("sdk-test-message2"), this.assertRoot + "#2"); messageCollection.Create("sdk-test-message1", "hello."); Assert.IsTrue(messageCollection.ContainsKey("sdk-test-message1"), this.assertRoot + "#3"); Message message = messageCollection.Get("sdk-test-message1"); Assert.AreEqual("sdk-test-message1", message.Key, this.assertRoot + "#4"); Assert.AreEqual("hello.", message.Value, this.assertRoot + "#5"); Args args2 = new Args(); args2.Add("value", "world."); messageCollection.Create("sdk-test-message2", args2); Assert.IsTrue(messageCollection.ContainsKey("sdk-test-message2"), this.assertRoot + "#6"); message = messageCollection.Get("sdk-test-message2"); Assert.AreEqual("sdk-test-message2", message.Key, this.assertRoot + "#7"); Assert.AreEqual("world.", message.Value, this.assertRoot + "#8"); messageCollection.Remove("sdk-test-message1"); Assert.IsFalse(messageCollection.ContainsKey("sdk-test-message1"), this.assertRoot + "#9"); messageCollection.Remove("sdk-test-message2"); Assert.IsFalse(messageCollection.ContainsKey("sdk-test-message2"), this.assertRoot + "#10"); }
/// <summary> /// 获取MessageContext,如果不存在,返回null /// 这个方法的更重要意义在于操作TM队列,及时移除过期信息,并将最新活动的对象移到尾部 /// </summary> /// <param name="userName">用户名(OpenId)</param> /// <returns></returns> private TM GetMessageContext(string userName) { while (MessageQueue.Count > 0) { TM val = MessageQueue[0]; TimeSpan timeSpan = DateTime.Now - (val.LastActiveTime.HasValue ? val.LastActiveTime.Value : DateTime.Now); double num = val.ExpireMinutes.HasValue ? val.ExpireMinutes.Value : ExpireMinutes; if (!(timeSpan.TotalMinutes >= num)) { break; } MessageQueue.RemoveAt(0); MessageCollection.Remove(val.UserName); val.OnRemoved(); } if (!MessageCollection.ContainsKey(userName)) { return(null); } return(MessageCollection[userName]); }
/// <summary> /// 获取MessageContext,如果不存在,返回null /// 这个方法的更重要意义在于操作TM队列,及时移除过期信息,并将最新活动的对象移到尾部 /// </summary> /// <param name="userName">用户名(OpenId)</param> /// <returns></returns> private TM GetMessageContext(string userName) { //检查并移除过期记录,为了尽量节约资源,这里暂不使用独立线程轮询 while (MessageQueue.Count > 0) { var firstMessageContext = MessageQueue[0]; var timeSpan = DateTime.Now - firstMessageContext.LastActiveTime; //确定对话过期时间 var expireMinutes = firstMessageContext.ExpireMinutes.HasValue ? firstMessageContext.ExpireMinutes.Value //队列自定义事件 : this.ExpireMinutes; //全局统一默认时间 //TODO:这里假设按照队列顺序过期,实际再加入了自定义过期时间之后,可能不遵循这个规律 —— Jeffrey Su 2018.1.23 if (timeSpan.TotalMinutes >= expireMinutes) { MessageQueue.RemoveAt(0); //从队列中移除过期对象 MessageCollection.Remove(firstMessageContext.UserName); //从集合中删除过期对象 //添加事件回调 firstMessageContext.OnRemoved();//TODO:此处异步处理,或用户在自己操作的时候异步处理需要耗费时间比较长的操作。 } else { break; } } /* * 全局只有在这里用到MessageCollection.ContainsKey * 充分分离MessageCollection内部操作, * 为以后变化或扩展MessageCollection留余地 */ if (!MessageCollection.ContainsKey(userName)) { return(null); } return(MessageCollection[userName]); }