在构造函数中连接线程C#事件

时间:2009-10-28 23:43:20

标签: c# multithreading events constructor

如果非gui对象构造函数将本地事件处理方法连接到另一个线程上的对象的事件字段,是否可以在构造函数完成之前调用所述事件处理方法?

示例:(仅限语义伪代码)

public static B b = new B();

class A
{
    public A()
    {
        b.evt += EventHandler();

        Thread.Sleep(5000);
    }

    protected void EventHandler()
    {
        // Some stuff
    }
}

class B
{
    public event evt;

    public void ThreadedLoop()
    {
        while (true)
        {
            RaiseEvt();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

是的,因为事件处理方法是在另一个线程的上下文中调用的。

在您的示例中,事件处理程序是类A的方法,但是在调用它时,它在类B表示的线程的上下文中调用。当执行类A的构造函数的线程休眠时,由B类将开始工作,提升事件并在此过程中调用事件处理程序。

答案 1 :(得分:1)

要记住的一件事是整个对象不在另一个线程上。如果该对象具有在不同线程中执行的例程,则对象直接进行的任何调用将在同一线程上执行。这包括委托调用。

因此,您的对象在特定线程上不存在,但是从它执行的例程确实存在。当有人从另一个线程调用你的一个例程时,该例程将在另一个线程上执行。这很重要,因为您拥有的类级别数据并不特别属于一个线程。如果您没有处理从另一个线程发生调用的事实,您最终可能会遇到并发问题并损坏对象的类级别数据。