Связывание потоковых событий C # в конструкторе - PullRequest
2 голосов
/ 29 октября 2009

Если конструктор объекта не из 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 ]

1 голос
/ 29 октября 2009

Следует иметь в виду, что весь объект находится не в другом потоке. Если у этого объекта есть подпрограмма, выполняющаяся в другом потоке, то любые вызовы, которые этот объект выполняет напрямую, будут выполняться в том же потоке. Это включает вызовы делегатов.

Итак, ваш объект не существует в определенном потоке, но выполняющиеся из него подпрограммы существуют. И когда кто-то вызывает одну из ваших подпрограмм из другого потока, эта подпрограмма будет выполняться в другом потоке. Это важно, потому что данные уровня класса не принадлежат ни одному конкретному потоку. Если вы не обрабатываете тот факт, что вызов происходит из другого потока, вы можете столкнуться с проблемами параллелизма и искажения данных на уровне класса вашего объекта.

1 голос
/ 29 октября 2009

Да, потому что метод обработки событий вызывается в контексте другого потока.

В вашем примере обработчик событий является методом класса A, но когда он вызывается, он вызывается в контексте потока, представленного классом B. Когда поток, выполняющий конструктор класса A, спит, поток, представленный класс B будет работать, вызывая событие и вызывая обработчик события в процессе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...