2011-06-10 68 views
1

我有一個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()); 
     } 
    } 
} 

我應該有對象上的新線程調用它的功能,並鎖定所以如果LoadItems運行CheckForUpdates不能叫,還是有更簡單的方法來做到這一點,我錯過了?

編輯:

我發現這個問題。我正在清理項目清單(所以它不會永遠增長),但我只是用新找到的項目填充它。所以每次運行應用程序時,只有列表中的最新項目以及所有較舊的項目被刷新。

笨蛋!

感謝您的幫助,並抱歉蹩腳的問題。

+1

加載處理運行時禁用應用程序輸入? – kenny 2011-06-10 14:50:55

回答

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(); 
} 
+0

本來我就是這麼想的,但它的行爲方式相同,所以我將它移至a_ItemsLoaded方法來嘗試修復問題。 – Tester101 2011-06-10 14:58:05

+0

將斷點添加到'CheckForUpdates()','a_FoundItems(...)'和'a_ItemsLoaded(...)'。到達這些斷點時檢查調用堆棧。 – mgronber 2011-06-10 15:02:41

+0

設置斷點幫助我意識到我的愚蠢。謝謝您的幫助。 – Tester101 2011-06-10 15:12:44

2

嗯,從你的代碼已經發布我沒有看到一個問題,特別是假設所有這些運行在UI線程..你可以張貼代碼項目的加載?

也許它自己加載的是觸發ItemsFound事件?您可以在ItemsLoaded的事件處理程序中執行ItemsFound的訂閱,而不是在構造函數中。

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(); 
    } 
}