Динамическое создание изображений с кодировкой URI асинхронно с отложенной загрузкой в приложении Web Forms

#c# #asp.net #asynchronous #webforms #lazy-loading

#c# #asp.net #асинхронный #веб-формы #отложенная загрузка

Вопрос:

Я динамически создаю много изображений в приложении веб-форм с кодировкой URI данных (без HttpHandler). Изображения загружаются из базы данных, и я фильтрую с помощью Isotope и отложенной загрузки. Я использую асинхронные задачи при загрузке страницы для извлечения данных и загрузки в элементы управления изображениями. Я также создал эскизы и применил сжатие изображений. Несмотря на это, загрузка страницы происходит очень медленно. У меня есть белая страница, пока не будет загружено все содержимое. Правильно ли я обрабатываю асинхронные методы? Разве это не должно позволять сначала отображать другой контент на странице?

Метод загрузки страницы

 RegisterAsyncTask(new PageAsyncTask(LoadImages));
  

Метод загрузки изображений:

     public Task LoadImages()
    {
        //Get Data from DB
        DataTable dtImages = GetData();
        int id = 0;
        foreach (DataRow row in dtImages.Rows)
        {
            id = Convert.ToInt32(row["FILE_ID"].ToString());
            var category = row["CATEGORY"].ToString();
            Byte[] bytes = ((Byte[])row["THUMBNAIL_CONTENT"]);
            
            //Method to create the content on the page:
            CreateDiv(id, bytes);
        }
        return Task.FromResult(0);
    }
    
  

Метод создания общих элементов управления HTML:

     public void CreateDiv(int imageID, byte[] fileBytes)
    {
        System.Web.UI.WebControls.Image image = new System.Web.UI.WebControls.Image();
        image.ID = "Image"   imageID.ToString()   "";
        if (imageID != 0)
        {
        //My animated gif:
            image.ImageUrl = "images/loader.gif"; ;
        }
        image.Attributes.Add("class", "img-fluid lazy");
        //The actual thumbnail:
        image.Attributes.Add("data-src", GetImage(fileBytes));
        image.Visible = true;
        PlaceHoldersDiv.Controls.Add(image);
    }
    
  

Метод возврата URI изображения:

     public string GetImage(object img)
    {
        return "data:image/jpg;base64,"   Convert.ToBase64String((byte[])img);
    }
    
  

Сценарий отложенной загрузки:

 document.addEventListener("DOMContentLoaded", function () {
    var lazyloadImages = document.querySelectorAll("img.lazy");
    var lazyloadThrottleTimeout;

    function lazyload() {
        if (lazyloadThrottleTimeout) {
            clearTimeout(lazyloadThrottleTimeout);
        }

        lazyloadThrottleTimeout = setTimeout(function () {
            var scrollTop = window.pageYOffset;
            lazyloadImages.forEach(function (img) {
                if (img.offsetTop < (window.innerHeight   scrollTop)) {
                    img.src = img.dataset.src;
                    img.classList.remove('lazy');
                }
            });
            if (lazyloadImages.length == 0) {
                document.removeEventListener("scroll", lazyload);
                window.removeEventListener("resize", lazyload);
                window.removeEventListener("orientationChange", lazyload);
            }
        }, 20);
    }

    document.addEventListener("scroll", lazyload);
    window.addEventListener("resize", lazyload);
    window.addEventListener("orientationChange", lazyload);
});
  

К вашему сведению, я пытался использовать Http-обработчик для загрузки изображений, но производительность была намного хуже!

Комментарии:

1. Хм, страница должна завершить код, а ЗАТЕМ отправить всю страницу клиенту. Если этот код не завершен, это не сработает. Вы должны запустить код без ожидания, а затем позволить странице отправляться обратно клиенту. Но опять же, если страница отправлена, вы ничего не сможете изменить с помощью кода (даже через асинхронный, поскольку этот код будет изменять копию страницы на стороне сервера, а не на стороне клиента. сидящий. Так что либо вы быстро выходите, и страница переходит на сторону клиента. Поэтому после отправки страницы клиенту вам необходимо использовать вызовы ajax для извлечения загрузки изображений.

2. @AlbertD.Kallal Означает ли это, что мне нужно полностью удалить метод CreateDiv в коде и сгенерировать все элементы управления HTML из вызова Ajax? Должен ли я отправлять байты изображения с сервера через вызов Ajax?

3. Код позади может, по крайней мере, создавать «divs» или удерживающие точки (с идентификатором). Страница должна отображаться и переходить на сторону клиента (а затем вы запускаете вызовы ajax). Некоторая форма сетки или даже списка, скажем, с изображением или кнопкой изображения, хороша. По крайней мере, в сетке или на дисплее будут заполнители для заполнения ajax-кода. Поскольку изображения взяты из базы данных, тогда нет URL-адресов (и, следовательно, нет автоматической многопоточности в браузере). Таким образом, вы должны их удалить. Я постоянно отправляю небольшие изображения из баз данных, скажем, в listview во время выполнения кода (будучи небольшим — задержки не происходит). Таким образом, вопрос о том, как загрузить изображение с помощью ajax