загрузка словарей при запуске с C # - PullRequest
2 голосов
/ 14 марта 2012

У меня есть 2 словаря (10 записей в Dict1, 30 в Dict2).Сейчас я использую этот код для их загрузки:

private void button1_Click(object sender, EventArgs e)
{
    Bitmap l0 = new Bitmap(@"C:\0money\0.bmp", true);
    // +100 more
    Dictionary<string, Bitmap> lookup = new Dictionary<string, Bitmap>();
    lookup.Add("0", l0);
    // +100 more
}

Я планирую создать еще 3 словаря, поэтому общее количество записей будет до 100 +!

Как мне загрузить все эти словари при запуске программы, а не загружать (многократно) по событию button_click?

Изменить: Как многие из вас предложили - я пытался поместить код в событие Form_LoadВ результате я получаю сообщение об ошибке «Имя« поиск »не существует в текущем контексте».Я не могу выполнить код для события button_click.

Ответы [ 5 ]

2 голосов
/ 14 марта 2012

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

private static Dictionary<string, Bitmap> _lookup = new Dictionary<string, Bitmap>();
static MyClass()
{
    lookup.Add("0", l0);
    // +100 more
}

Если экземпляр класса создается только один раз, сделайте его нестатичным. Здесь я предполагаю, что class, в котором он находится, называется MyClass соответствующим образом.

2 голосов
/ 14 марта 2012

Возможно, вы захотите сохранить его в контексте приложения (если оно будет повторно использоваться всем приложением и не зависит от пользователя).

Лучшим способом было бы сделать это при запуске приложения, что можно сделатьобрабатывать в Global.asax.

Надеюсь, это поможет.

ОБНОВЛЕНИЕ Я не думаю, что на самом деле хранение целых объектов Bitmap - хорошая идея!Возможно, вы захотите еще раз подумать об архитектуре вашего приложения и о том, чего вы пытаетесь достичь.

СЦЕНАРИЙ WEB FARM В сценарии веб-фермы это будет другой сценарий.Каждое из ваших приложений будет иметь свой экземпляр переменных приложения.

Затем я испытываю желание предложить сервер состояния сеанса и сохранить его в сеансе (который затем будет доступен для всех приложений) - вы можете запуститьОднако при некоторых проблемах со стандартным сервером состояния сеанса

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

1 голос
/ 14 марта 2012

Если вы используете WinForms , поместите свой код в событие загрузки формы.

private void Form1_Load(object sender, System.EventArgs e) {
    Dictionary<string, Bitmap> lookup = new Dictionary<string, Bitmap>() {
        {"0", new Bitmap(@"C:\0money\0.bmp", true)},
        {"1", new Bitmap(@"C:\0money\1.bmp", true)}
    }
}

ОБНОВЛЕНИЕ

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

public class MyFancyForm {

    private Dictionary<string, Bitmap> lookup;

    private void Form1_Load(object sender, System.EventArgs e) {
        // init dictionary
        lookup = new Dictionary<string, Bitmap>() {
            {"0", new Bitmap(@"C:\0money\0.bmp", true)},
            {"1", new Bitmap(@"C:\0money\1.bmp", true)}
        }
    }

    private void button1_Click(object sender, EventArgs e) {
        // do something with lookup
    }
}
0 голосов
/ 14 марта 2012

Предполагая, что ваш список файлов имеет имена от 0.bmp до 100.bmp, вы можете сделать что-то вроде:

string startupFolder = @"C:\0money\";
Dictionary<string, Bitmap> lookup = new Dictionary<string, Bitmap>();
for(int i = 0; i <= 100; i++)
{
    Bitmap l = new Bitmap(startupFolder + i + ".bmp", true); 
    lookup.Add(i.ToString(), l);
} 

Возможно, вы захотите поместить этот код в form_load, чтобы добавить их при запуске.

0 голосов
/ 14 марта 2012

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

Я не буду использовать контекст приложения для приведенных ниже ответов:

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

http://msdn.microsoft.com/en-us/library/ms178594.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...