Проблема управления потоком приложения - PullRequest
1 голос
/ 10 июня 2011

У меня есть приложение 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());
        }
    }
}

Должен ли я вызывать объект A, вызывать его функции в новом потоке и блокировать, чтобы CheckForUpdates нельзя было вызывать, если запущен LoadItems, или есть более простой способ сделать это, которого мне не хватает?

EDIT:

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

STUPID !!!

Спасибо за помощь, и извините за дерьмовый вопрос.

Ответы [ 2 ]

2 голосов
/ 10 июня 2011

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

Возможно, сама загрузка запускает событие ItemsFound?Вы можете сделать подписку на ItemsFound в обработчике событий для 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();
    }
}
2 голосов
/ 10 июня 2011

Есть ли причина, по которой проверка не находится в конструкторе?

public MainForm()
{
    InitializeComponent();
    a = new A();
    a.ItemsFound += new A.NewItemsFoundEventHandler(a_FoundItems);
    a.ItemsLoaded += new A.ItemsLoadedEventHandler(a_ItemsLoaded);
    a.LoadItems();
    a.CheckForUpdates();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...