2011-06-10 6 views
1

私が作業しているWindows Formsアプリケーションがありますが、アプリケーションを起動するときに問題があります。アプリケーションは、設定ファイルから保存された情報を読み込み、新しい項目を確認する必要があります。アプリケーションを起動すると、保存されたアイテムのロードが完了する前に、新しいアイテムの検索が開始されます。このため、ユーザーは本当に新しいものではない新しい項目について警告を受け、まだファイルからロードされていないだけです。アプリケーションのフローを制御する際の問題

フォーム:

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を呼び出すことはできませんので、それは新しいスレッド上の機能、およびロックの呼びかけオブジェクトありましたら、または私が行方不明になっているこれを行う簡単な方法はありますか?

EDIT:

私は問題を発見しました。私はアイテムのリストをクリアしていたので(永遠には伸びないだろうが)、私は新しく見つかったアイテムだけを埋めていた。だから毎回、アプリケーションを実行するたびに、最新のアイテムだけが一覧に表示され、古いアイテムはすべてフラッシュされました。

STUPID !!!

ご協力ありがとうございます。ごめんなさい質問を申し訳ありません。

+1

ローディング処理中にアプリケーション入力を無効にしますか? – kenny

答えて

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

+0

CheckForUpdates()、a_FoundItems(...)、およびa_ItemsLoaded(...)にブレークポイントを追加します。それらのブレークポイントに到達すると、コールスタックをチェックします。 – mgronber

+0

ブレークポイントを設定すると、私の愚かさを実感できました。助けてくれてありがとう。 – Tester101

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(); 
    } 
} 
関連する問題