C# 在调用初始化器之前添加事件处理程序
我有两个类C# 在调用初始化器之前添加事件处理程序,c#,wpf,event-handling,initializer,C#,Wpf,Event Handling,Initializer,我有两个类main window和Foo,在计时方面有点问题: class MainWindow : Window { internal void SomeMethod(string name) { Foo foo = new foo(name) foo.MyEventHandler += EventHandlerMethod; } internal void EventHandlerMethod(object sender, E
main window
和Foo
,在计时方面有点问题:
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
-初始化的线程将花费多长时间和FooMethod()可能在添加MyEventHandler
之前调用code>
我想到了一个可能的解决方案,即不添加初始值设定项,而是使用一个单独的方法,并在添加事件后简单地调用该方法,但一般来说,有没有一种方法可以在调用初始值设定项之前添加事件?您以前不能这样做,但可以作为构造函数的一部分来做。只需将处理程序作为参数传入即可
然而,这很难看。拥有生成线程的构造函数并不好,拥有一个“Start”方法要好得多,你以前不能这样做,但你可以作为构造函数的一部分来做。只需将处理程序作为参数传入即可
然而,这很难看。让构造函数生成线程并不好,最好有一个“Start”方法当然,只需添加一个Foo.StartWork()方法。简单的豌豆。确保线程在窗口关闭后停止引发事件是您真正应该担心的问题。谢谢您的评论,但我在最后一句话中已经提到了这一点。我的问题其实是关于别的。是的,我已经确定如果窗口关闭,不会引发任何事件。初始化完成后,我需要从主窗口中的Foo获取信息。我使用线程是因为初始化可能需要一分钟的时间,我不想让UI冻结使用TPL怎么样?“使用线程一切都很好,但我的问题只是一些其他问题,对不起,如果我听起来粗鲁,我真的不是故意的。当然,只需添加一个Foo.StartWork()方法。简单的豌豆。确保线程在窗口关闭后停止引发事件是您真正应该担心的问题。谢谢您的评论,但我在最后一句话中已经提到了这一点。我的问题其实是关于别的。是的,我已经确定如果窗口关闭,不会引发任何事件。初始化完成后,我需要从主窗口中的Foo获取信息。我使用线程是因为初始化可能需要一分钟的时间,我不想让UI冻结使用TPL怎么样?使用线程一切都很好,但我的问题只是关于其他事情,对不起,如果我听起来粗鲁,我真的不是故意的。谢谢你的回答。我使用构造函数的原因一开始很简单:必须调用线程,因为我需要打开并初始化文件中的大量数据,
Foo
将包含所有数据,因此,不同线程中没有长init,也没有Foo。当我现在意识到在一些罕见的情况下,当线程完成时,我需要一个信号发送到MainWindow
,这个问题就出现了。谢谢你的回答。我使用构造函数的原因一开始很简单:必须调用线程,因为我需要打开并初始化文件中的大量数据,Foo
将包含所有数据,因此,不同线程中没有长init,也没有Foo。当我现在意识到在一些罕见的情况下,当线程完成时,我需要一个信号到MainWindow
,问题就出现了。