dsjohn Ответов: 3

Реализация на языке C# “кэш” за наследство .Объем 3.5 “настольных” приложений?


Мне было назначено “устаревшее” приложение .Net 3.5 C# “desktop”. У меня ограниченный опыт работы с C#/.Net 3.5. Пользователи “настольного” приложения хотят, чтобы загрузка конкретной формы Windows имела лучшую производительность. При загрузке форма считывает в “DataTable” примерно 3300 записей с пятью столбцами из базы данных Oracle с помощью “DbDataAdapter”. Я хочу "кэшировать" эти записи при первой загрузке формы и считывать их из кэша при любой последующей загрузке формы.

Я уже некоторое время изучаю способы реализации "кэша" C# .Net 3.5, но большинство решений относятся к ASP.NET или класс " MemoryCache” из платформы .Net 4.0.

Может ли кто-нибудь предложить метод реализации "кэша" C# .Net 3.5, который использует платформу .Net 3.5 в “настольном” приложении?

Что я уже пробовал:

Я попробовал использовать реализацию "кэша" в статье Cache<t>: A threadsafe, Simple, Efficient, Generic In-memory Cache, но получаю ошибки, которые, как я считаю, являются результатом использования платформы .Net 3.5.

3 Ответов

Рейтинг:
2

F-ES Sitecore

using System.Data;

namespace MyNamespace
{
    public sealed class MyData
    {
        private static readonly MyData instance = new MyData();
        private DataTable data;

        public DataTable Data
        {
            get
            {
                return data;
            }
        }
            
        static MyData()
        {
        }

        private MyData()
        {
            // Populate your data here

            data = new DataTable();
            data.Columns.Add("ID", typeof(int));
            data.Columns.Add("Name", typeof(string));

            data.Rows.Add(1, "John");
            data.Rows.Add(1, "David");
        }

        public static MyData Instance
        {
            get
            {
                return instance;
            }
        }
    }
}


Использование

private void Form1_Load(object sender, EventArgs e)
{
    DataTable dt = MyData.Instance.Data;

    System.Diagnostics.Debug.WriteLine(dt.Rows[0][0].ToString() + " " + dt.Rows[0][1].ToString());
}


Рейтинг:
1

Dave Kreskowiak

Кэширование действительно не очень поможет с этой проблемой.

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

Проблема заключается в том, что вы загружаете 3300 записей в DataGrid. Это займет целую вечность.

Реальное решение состоит в том, чтобы либо отфильтровать записи вниз, чтобы вы не загружали тысячи записей, либо подкачать страницы, где вы только извлекаете 20-30 записей для заполнения сетки, и вы загружаете больше, когда пользователь просматривает страницы вниз по сетке.


Рейтинг:
0

Afzaal Ahmad Zeeshan

Рекомендация состоит в том, чтобы никогда не пачкать руки для таких ориентированных на производительность частей вашего приложения, если у вас нет солидного опыта/понимания. О, Прежде чем я начну отвечать, я должен предложить, чтобы миграция кода в .NET Framework 4 и далее (.NET Core и .NET Core vNext) была предпочтительным маршрутом здесь. .NET Framework 3 и более старые системы больше не поддерживаются, и вы с большей вероятностью столкнетесь с такими проблемами.

Если вы заинтересованы в использовании решения для кэширования в памяти, пожалуйста, обратитесь к современным системам кэширования, таким как Redis/Memcached, чтобы наилучшим образом использовать ресурсы кэширования и систему.

Редис[^]

Примечание: пожалуйста, проверьте, обеспечивают ли серверные/клиентские библиотеки для систем кэширования поддержку .NET Framework 3.5, которая является весьма маловероятно.

Если вы все еще ищете что-то более обычное, то попробуйте проверить эта нить на так[^]; это дает представление о том, как выглядит кэш-система. Следует отметить, что кэширование-это больше, чем просто хранение, кэширование-это удаление элементов, когда они больше не нужны в кэше для поддержания управляемого размера и т. д.