使用C#在启动时加载字典

时间:2012-03-14 11:26:06

标签: c# winforms

我有2个字典(Dict1中有10个条目,Dict2中有30个条目)。现在我正在使用此代码加载它们:

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 个答案:

答案 0 :(得分:2)

您可能希望将其存储在应用程序上下文中(如果它将被整个应用程序重用,并且它不是特定于用户的。)

最好的方法是在Application Start上执行,您可以在Global.asax中处理。

希望它有所帮助。

<强>更新 我不认为实际存储整个Bitmap对象是个好主意!您可能想再次考虑应用程序的体系结构以及您要实现的目标。

WEB FARM SCENARIO 在webfarm场景中,这将是一个不同的场景。您的每个应用都将拥有不同的应用变量实例。

然后我想建议使用会话状态服务器并将其保持在会话中(然后将在所有应用程序中共享) - 您可能会遇到标准会话状态服务器的一些问题,但

您也可以将资源(由应用程序共享)复制到网络路径上或作为二进制文件存储在数据库中,然后在每个服务器节点应用程序启动时加载它们 - 您仍然可以在每个服务器节点中拥有这些资源

答案 1 :(得分:2)

您可以将其保留在类实例上或静态,具体取决于它的使用方式。

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

如果类的实例仅创建一次,则将其设置为非静态。在这里,我假设class这个被称为MyClass,视情况而定。

答案 2 :(得分:1)

如果您使用的是 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
    }
}

答案 3 :(得分:0)

您可以Cache在用户之间共享它们。请记住,如果要部署在服务器场上,则必须使用“组件”来管理Web场中的缓存。

我不会在下面的resons中使用Application上下文:

应用程序状态不在服务于同一应用程序的多个服务器之间共享,如在Web场中,或在同一服务器上为同一应用程序提供服务的多个工作进程之间共享,如在Web园中。因此,您的应用程序不能依赖于跨不同服务器或进程的包含相同数据的应用程序状态。如果您的应用程序将在多处理器或多服务器环境中运行,请考虑使用更具伸缩性的选项(如数据库),以获取必须在整个应用程序中保持保真度的数据。

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

答案 4 :(得分:0)

假设您的文件列表是从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中,以便在启动时添加它们。