контекст потока для пользовательского события? - PullRequest
0 голосов
/ 14 декабря 2011

У меня есть некоторый код, подобный этому

MyClass Foo = new MyClass()
Foo.OnSomeEvent += new SomeEvent(Foo_SomeEvent);
ThreadPool.QueueUserWorkItem(Foo.MyMethod, SomeParams);

Мой вопрос заключается в том, что когда OnSomeEvent запускается и вызывается этот метод Foo_SomeEvent, будет ли он выполняться в контексте потока в потоке потоков или это поток, где яв очереди на ThreadPool?

1 Ответ

3 голосов
/ 14 декабря 2011

Если это Foo.MyMethod, которое инициирует событие, поскольку Foo.MyMethod запускается в потоке из пула, тогда обратный вызов события также будет выполняться в потоке из пула.Это легко проверить:

public class MyClass
{
    public EventHandler OnSomeEvent;
    public void MyMethod(object state)
    {
        OnSomeEvent(null, null);
    }
}

class Program
{
    static void Main()
    {
        Console.WriteLine(
            "main thread id: {0}", 
            Thread.CurrentThread.GetHashCode()
        );

        MyClass Foo = new MyClass();
        Foo.OnSomeEvent += new EventHandler(Foo_SomeEvent);
        ThreadPool.QueueUserWorkItem(Foo.MyMethod, null);
        Console.ReadKey();
    }

    static void Foo_SomeEvent(object sender, EventArgs e) 
    {
        Console.WriteLine(
            "Foo_SomeEvent thread id: {0}", 
            Thread.CurrentThread.GetHashCode()
        );
    }
}

печатает на моей консоли:

main thread id: 1
Foo_SomeEvent thread id: 3
...