2013-09-15 6 views
0

У меня есть два класса MainWindow и Foo и иметь небольшую проблему с учетом времени:Добавление обработчика событий перед тем initializier называется

class MainWindow : Window 
{ 
    internal void SomeMethod(string name) 
    { 
     Foo foo = new foo(name) 
     foo.MyEventHandler += EventHandlerMethod; 
    } 

    internal void EventHandlerMethod(object sender, EventArgs e) 
    { 
     //do something after foo is done initializing stuff 
    } 
} 

class Foo 
{ 
    internal event EventHandler MyEventHandler; 

    internal Foo(string name) 
    { 
     //start another thread that will at some point via event call FooMethod() 
    } 

    private void FooMethod() 
    { 
     MyEventHandler(this, null); 
    } 
} 

Проблема заключается в том, что я не могу гарантировать, как долго Foo -initialized нить будет принимать и FooMethod(); можно назвать до MyEventHandler.

Я думал о возможном решении просто не добавлять инициализатор, но иметь отдельный метод и просто вызывать его после добавления события, но в целом есть ли способ добавить события до того, как вызывается инициализатор?

+0

Конечно, просто добавьте метод Foo.StartWork(). Очень просто. Обеспечение того, что поток прекратит поднимать события после закрытия окна, является проблемой, о которой вы действительно должны беспокоиться. –

+0

Спасибо за комментарий, но я уже упомянул об этом в своем последнем предложении. Мой вопрос был о чем-то другом. И да, я уже убедился, что никаких событий не возникает, если окно закрыто. – phil13131

+0

Мне нужна информация от Foo в MainWindow после завершения инициализации. И я использую потоки, потому что инициализация может занять до одной минуты, и я не хочу, чтобы пользовательский интерфейс зависал – phil13131

ответ

3

Вы не можете сделать это раньше, но можете сделать это как часть конструктора. Просто передайте обработчик в качестве параметра.

Однако, это довольно уродливо. Наличие конструкторов, создающих потоки, не очень хорошо, гораздо лучше иметь метод «Пуск»

+0

ОТПРАВЛЯЕТ вас за ответ. Причина, по которой я пошел с конструктором, была простой в начале: поток должен быть вызван, так как мне нужно открыть и инициализировать большое количество данных из файла, а 'Foo' будет содержать все данные, следовательно, нет длинных init в другой теме, нет foo. Проблема возникла, когда я понял, что в некоторых редких случаях мне нужен сигнал 'MainWindow', когда поток выполняется. – phil13131

Смежные вопросы