Удаление определенных объектов от Кэша (ASP.NET)

Я не знаю, как вы используете карту, но недавно я сделал что-то вроде этого:

    // GET: Mappa
    public ActionResult Map()
    {
        // get fontane
        Fontane[] fontane = db.Fontane.ToArray();
        // prepare json string
        string markers = "[";
        // loop fontane
        for (int i = 0; i < fontane.Count(); i++)
        {
            markers += "{";
            // id
            markers += string.Format("\"fId\": \"{0}\",", fontane[i].FontanaID);
            // name
            markers += string.Format("\"title\": \"{0}\",", fontane[i].Nome);
            // position
            markers += string.Format("\"lat\": \"{0}\"", fontane[i].Latitudine).Replace(",", ".") + ",";
            markers += string.Format("\"lng\": \"{0}\"", fontane[i].Longitudine).Replace(",", ".") + ",";
            // icon
            string fIcon =  fontane[i].Active == true ? 
                (fontane[i].Allarme == true ? "/Content/icons/fontana_R.png" : "/Content/icons/fontana_G.png") : 
                "/Content/icons/fontana_W.png";
            // icon
            markers += string.Format("\"icon\": \"{0}\"", fIcon);
            markers += "},";
        }
        markers += "];";

        ViewBag.Markers = markers;
        return View();
    }

в контроллере MVC. как вы можете видеть, я выбираю значки перед тем, как отправлять их на экран.

@model Presidium.Models.Fontane
@{
ViewBag.Title = "Map";
}


<div id="gMap" style="height:100vh;width:100vw;"></div>

<script>
    let markers = @Html.Raw(ViewBag.Markers);
    window.onload = function () {
        let mapOptions = {
            center: new google.maps.LatLng(41.893140, 12.483330),
            zoom: 15,
            mapTypeId: google.maps.MapTypeId.SATELLITE,
            scrollwheel: true,
            draggable: true
        };
        let map = new google.maps.Map(document.getElementById("gMap"), mapOptions);
        for (i = 0; i < markers.length; i++) {
            let data = markers[i]
            let fLatLng = new google.maps.LatLng(data.lat, data.lng);

            let marker = new google.maps.Marker({
                position: fLatLng,
                map: map,
                title: data.title,
                icon: data.icon
            });
            map.setTilt(0);
            (function (marker, data) {
                google.maps.event.addListener(marker, "click", function (e) {
                    let url = "/Fontane/Details/" + data.fId;
                    window.location.href = url; 
                });
            })
            (marker, data);
        }
    }


</script>

Теперь я не нахожу его, но у меня есть приложение, которое имеет различные анимации и значки для визуализации лучших сигналов тревоги. В конце я нахожу это простым подходом. Как я уже говорил, просматривал формы и анимацию автомобилей в режиме реального времени на карте, изменяя масштаб, и это была настоящая кровавая баня.

11
задан Adrian Hope-Bailie 1 April 2009 в 09:30
поделиться

5 ответов

Вы не можете удалить объекты из набора, пока Вы выполняете итерации по нему так, необходимо сделать что-то вроде этого:

List<string> itemsToRemove = new List<string>();

IDictionaryEnumerator enumerator = Cache.GetEnumerator();
while (enumerator.MoveNext())
{
    if (enumerator.Key.ToString().ToLower().StartsWith(prefix))
    {
        itemsToRemove.Add(enumerator.Key.ToString());
    }
}

foreach (string itemToRemove in itemsToRemove)
{
    Cache.Remove(itemToRemove);
}

Этот подход прекрасен и более быстр и легче, чем зависимости от кэша.

20
ответ дан 3 December 2019 в 04:53
поделиться

Вы могли записать подкласс CacheDependency это делает аннулирование соответственно.

2
ответ дан 3 December 2019 в 04:53
поделиться

Для очистки кеша я предполагаю, что вам нужно запустить его вручную, когда вы заметите, что в кеше слишком много элементов. Используя блок MS lib cache, он может выполнить эту работу автоматически. В конфигурации кеширования; вы можете установить свойство MaximumElementsInCacheBeforeScavenging; как только количество элементов кеша превысит лимит, менеджер кеша автоматически очистит кеш.

0
ответ дан 3 December 2019 в 04:53
поделиться

Это действительно зависит от количества Ваших объектов кэша и как часто Вы делаете очистку. Я волновался бы об этом, только если это на самом деле была проблема производительности - т.е. измерьте его.

Ваше решение прекрасно мне, если Вы не делаете что-то экстремальное значение.

0
ответ дан 3 December 2019 в 04:53
поделиться

Вы должны хранить другой элемент в кеше только для этой цели. Допустим, вы кешируете 10.000 элементов с такими ключами, как: cache_prefix_XXX. Таким образом, добавляя элемент только с cache_prefix в качестве ключа и добавляя остальные из них в зависимости от этого ключа, вы можете контролировать удаление всех из них. Одна вещь, которую следует учитывать, - это приоритеты. Установите для этого конкретного элемента более высокий приоритет, чем фактические элементы данных.

1
ответ дан 3 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: