private void DoCache(CustomUser u) { lock (this) { HttpRuntime.Cache.Add(u, u.Login, CacheItemPriority.High, OnRemovedFromCache); CachedUsers.Add(u); } }
/// <summary> /// 获取缓存用户实例。 /// </summary> /// <param name="id">用户Id。</param> /// <returns>返回缓存用户实例对象。</returns> public virtual CachedUser GetCachedUser(int id) { if (CachedUsers.TryGetValue(id, out var user)) { return(user); } user = CachedQueryable.Where(x => x.Id == id).FirstOrDefault(Converter); CachedUsers.TryAdd(id, user); return(user); }
/// <summary> /// 获取缓存用户实例。 /// </summary> /// <param name="id">用户Id。</param> /// <returns>返回缓存用户实例对象。</returns> public virtual async Task <CachedUser> GetCachedUserAsync(int id) { if (CachedUsers.TryGetValue(id, out var user)) { return(user); } user = await CachedQueryable.Where(x => x.Id == id).FirstOrDefaultAsync(Converter); CachedUsers.TryAdd(id, user); return(user); }
private void OnRemovedFromCache(string key, object value, CacheItemRemovedReason reason) { string ck = CacheUtility.GetKey <CustomUser>(key); lock (this) { var ind = CachedUsers.FindIndex(u => u.Login == ck); if (ind >= 0) { CachedUsers.RemoveAt(ind); } } }
/// <summary> /// 获取缓存用户实例列表。 /// </summary> /// <param name="ids">用户Id。</param> /// <returns>返回缓存用户实例对象列表。</returns> public virtual IEnumerable <CachedUser> GetCachedUsers(int[] ids) { var users = CachedUsers.Values.Where(x => ids.Contains(x.Id)).ToList(); var cacheds = users.Select(x => x.Id); ids = ids.Where(x => !cacheds.Contains(x)).ToArray(); if (ids.Length > 0) { var current = CachedQueryable.Where(x => x.Included(ids)).AsEnumerable(Converter); foreach (var cachedUser in current) { CachedUsers.TryAdd(cachedUser.Id, cachedUser); } users.AddRange(current); } return(users); }
/// <summary> /// Вызывается при получении новых сообщений через LongPoll. /// </summary> private async void VKLongPollService_MessagesReceived(object sender, MessagesReceivedEventArgs e) { var ids = new ulong[e.Messages.Count]; for (int i = 0; i < e.Messages.Count; i++) { ids[i] = e.Messages[i].MessageID; } List <VKMessage> resultMessages = null; bool success = false; byte numOfRetries = 0; while (!success && numOfRetries <= 3) { var request = new GetByIDRequest { MessageIDs = ids.ToList() }; var response = await request.ExecuteAsync(); if (response.Error.ErrorType == VKErrors.None) { success = true; resultMessages = response.Response.Items; } else { numOfRetries++; CoreHelper.SendInAppPush( "Ошибка соединения.\nПовтор через " + 3 * numOfRetries + " секунд", null, PopupMessageType.Warning); await Task.Delay(3000 *numOfRetries); } } if (!success) { CoreHelper.SendInAppPush( "Не удалось получить подробные сообщения", "LongPoll", PopupMessageType.Error); return; } var unknownUsers = new Dictionary <ulong, List <VKMessage> >(); var conversations = new Dictionary <long, List <VKMessage> >(); foreach (var msg in resultMessages) { long key = msg.IsChatMessage ? -msg.ChatID : (long)msg.UserID; if (conversations.ContainsKey(key)) { conversations[key].Add(msg); } else { var list = new List <VKMessage>(); list.Add(msg); conversations[key] = list; } if (CachedUsers.ContainsKey(msg.UserID)) { msg.Sender = CachedUsers[msg.UserID]; } else { if (unknownUsers.ContainsKey(msg.UserID)) { unknownUsers[msg.UserID].Add(msg); } else { var list = new List <VKMessage>(); list.Add(msg); unknownUsers[msg.UserID] = list; } } } success = unknownUsers.Count == 0; numOfRetries = 0; while (!success && numOfRetries <= 3) { var usersRequest = new GetUsersRequest() { UserIDs = unknownUsers.Keys.ToList() }; var usersResponse = await usersRequest.ExecuteAsync(); if (usersResponse.Error.ErrorType == VKErrors.None) { success = true; foreach (var user in usersResponse.Response) { var sUser = new VKProfileChat() { ID = user.ID, FirstName = user.FirstName, LastName = user.LastName, Online = user.Online, Photo50 = user.Photo50 }; var list = unknownUsers[user.ID]; for (int i = 0; i < list.Count; i++) { list[i].Sender = sUser; } CachedUsers[sUser.ID] = sUser; } } else { numOfRetries++; CoreHelper.SendInAppPush( "Ошибка соединения.\nПовтор через " + 3 * numOfRetries + " секунд", null, PopupMessageType.Warning); await Task.Delay(3000 *numOfRetries); } } if (!success) { CoreHelper.SendInAppPush( "Не удалось получить информацию о пользователях сообщений", null, PopupMessageType.Error); } foreach (long convID in conversations.Keys) { var msgsList = conversations[convID]; var cachedConv = Conversations.Keys.FirstOrDefault(c => c.ID == convID); if (cachedConv != null) { var list = Conversations[cachedConv]; foreach (var msg in msgsList) { list.Insert(0, msg); } } else { MessagesCollection list = null; if (convID < 0) { list = new MessagesCollection((uint)-convID); } else { list = new MessagesCollection((ulong)convID); } cachedConv = await ServiceHelper.MessagesCacheService.GetConversationFromCache(convID); if (cachedConv != null) { foreach (var msg in cachedConv.CachedMessages) { list.Add(msg); } } else { if (convID < 0) { success = false; numOfRetries = 0; while (!success && numOfRetries <= 3) { var request = new GetChatRequest() { ChatID = -convID, IsSingle = true, Fields = new List <VKUserFields> { VKUserFields.photo_50, VKUserFields.online, VKUserFields.sex } }; var response = await request.ExecuteAsync(); if (response.Error.ErrorType == VKErrors.None) { success = true; cachedConv = new CachedConversationOld { ID = convID, Title = response.Response.Title, Users = new ObservableCollection <VKProfileChat>(response.Response.Users), CachedMessages = msgsList, AdminID = response.Response.AdminID }; Conversations[cachedConv] = list; foreach (var user in cachedConv.Users) { CachedUsers[user.ID] = user; } } else { numOfRetries++; CoreHelper.SendInAppPush( "Ошибка соединения.\nПовтор через " + 3 * numOfRetries + " секунд", null, PopupMessageType.Warning); await Task.Delay(3000 *numOfRetries); } } } else { success = false; numOfRetries = 0; while (!success && numOfRetries <= 3) { var request = new GetUsersRequest { UserID = (ulong)convID }; var response = await request.ExecuteAsync(); if (response.Error.ErrorType == VKErrors.None) { success = true; var user = response.Response[0]; cachedConv = new CachedConversationOld { ID = convID, Title = user.FullName, Users = new ObservableCollection <VKProfileChat> { new VKProfileChat { ID = user.ID, LastName = user.LastName, FirstName = user.FirstName, Photo50 = user.Photo50, Online = user.Online } } }; CachedUsers[user.ID] = cachedConv.Users[0]; } else { numOfRetries++; CoreHelper.SendInAppPush( "Ошибка соединения.\nПовтор через " + 3 * numOfRetries + " секунд", null, PopupMessageType.Warning); await Task.Delay(3000 *numOfRetries); } } } } foreach (var msg in msgsList) { list.Insert(0, msg); } //list.UpdateSimilar(); Conversations[cachedConv] = list; } await CacheConversation(cachedConv.ID); WorkOnDialog(msgsList.Last()); var lastMsg = msgsList.LastOrDefault(m => m.Type == VKMessageType.Received); if (lastMsg == null) { continue; } var navParameter = new NavigateToPageMessage { Page = AppViews.ConversationView, Parameter = convID }; CoreHelper.SendInAppPush(lastMsg.Body, cachedConv.Title, PopupMessageType.Default, lastMsg.Sender.Photo50, parameter: navParameter); } await ServiceHelper.MessagesCacheService.CacheDialogs(Dialogs.Take(20).ToList()); }