控制应用程序流程的问题

时间:2011-06-10 14:49:43

标签: c# windows events event-handling

我有一个我正在处理的Windows窗体应用程序,但是当我启动应用程序时遇到了麻烦。应用程序应从配置文件中加载已保存的信息,然后检查新项目。当我启动应用程序时,它会在完成加载已保存项目之前开始查找新项目。因此,用户会收到新项目的警报,这些新项目并非真正的新项目,但它们尚未从文件中加载。

表格:

public class MainForm : Form
{
    A a;

    public MainForm()
    {
        InitializeComponent();
        a = new A();
        a.ItemsFound += new A.NewItemsFoundEventHandler(a_FoundItems);
        a.ItemsLoaded += new A.ItemsLoadedEventHandler(a_ItemsLoaded);
        a.LoadItems();
    }

    public void a_FoundItems(object sender, EventArgs e)
    {
        //Alert user of new items.
    }
    public void a_ItemsLoaded(object sender, EventArgs e)
    {
        //Update GUI with items loaded from file.
        this.UpdateTheGUI_ThisIsNotARealMethodInMyProgram();

        //Then look for new items.
        a.CheckForUpdates();
    }
}

另一个对象:

public class A
{
    public A(){}

    public void LoadItems()
    {
        //Load Items from save file...
        OnItemsLoaded(this);
    }

    public void CheckForUpdates()
    {
        //Check for new items...
        //If new items are found, raise ItemsFound event
        OnNewItemsFound(this,new EventArgs());
    }   

    public delegate void NewItemsFoundEventHandler(object sender, EventArgs e);
    public event NewItemsFoundEventHandler ItemsFound;
    protected void OnNewItemsFound(object sender, EventArgs e)
    {
        if(ItemsFound != null)
        {
            ItemsFound(sender,e);
        }
    }

    public delegate void ItemsLoadedEventHandler(object sender, EventArgs e);
    public event ItemsLoadedEventHandler ItemsLoaded;
    protected void OnItemsLoaded(object sender)
    {
        if(ItemsLoaded != null)
        {
            ItemsLoaded(sender,new System.EventArgs());
        }
    }
}

我是否应该有对象A在新线程上调用它的函数,并锁定所以如果LoadItems正在运行则无法调用CheckForUpdates,或者是否有一种更简单的方法来执行此操作我缺少?

修改

我发现了问题。我正在清理物品清单(因此它不会永远增长),但我只是用新发现的物品填充它。因此,每次我运行应用程序时,只会列出列表中的最新项目,并刷新所有旧项目。

STUPID !!!

感谢您的帮助,并为这个糟糕的问题感到抱歉。

2 个答案:

答案 0 :(得分:2)

检查不在构造函数中是否有任何理由?

public MainForm()
{
    InitializeComponent();
    a = new A();
    a.ItemsFound += new A.NewItemsFoundEventHandler(a_FoundItems);
    a.ItemsLoaded += new A.ItemsLoadedEventHandler(a_ItemsLoaded);
    a.LoadItems();
    a.CheckForUpdates();
}

答案 1 :(得分:2)

嗯,从您发布的代码我没有看到问题,特别是假设所有这些都在ui线程上运行..你可以发布加载项目的代码吗?

也许自己加载是ItemsFound事件?您可以在ItemsFound的eventhandler中为ItemsLoaded订阅,而不是在构造函数中订阅。

public class MainForm : Form
{
    A a;
    public MainForm()
    {
        InitializeComponent();
        a = new A();
        a.ItemsLoaded += new A.ItemsLoadedEventHandler(a_ItemsLoaded);
        a.LoadItems();
    }

    public void a_ItemsLoaded(object sender, EventArgs e)
    {
        a.ItemsFound += new A.NewItemsFoundEventHandler(a_FoundItems);
        a.CheckForUpdates();
    }
}