2
new System.Threading.Thread(() =>
    {
        var myObject = new CustomObject();
        myObject.SomeEvent += SomeMethod;
    }).Start();

第 1 部分:假设我在 winforms 应用程序的主 UI 线程上运行上述代码。哪个Thread电话会SomeMethod发生?Thread它们会发生在我创建对象时创建的同一处吗?

第 2 部分:使用 Visual Studio 2010,我如何自己解决这个问题?我不知道你在哪里找到Thread正在运行的东西。

4

4 回答 4

9

事件处理程序SomeMethod将在引发事件的任何线程上运行。

您可以在事件处理程序中设置断点SomeMethod并查看“线程”窗口(您可能希望为线程提供有意义的名称以找到它们)。

于 2012-09-18T14:25:54.280 回答
2

要找出您当前正在执行的线程,您可以使用Thread.CurrentThread.ManagedThreadId.

回答您的问题: SomeMethod 将在引发事件的线程中执行。

在您的情况下,它实际上永远不会在您将方法分配给事件时执行,但从未真正引发事件。

于 2012-09-18T14:26:33.013 回答
0

只是想添加一个简单的测试,允许您检查处理程序执行的线程:

class Test
{
    delegate void update();
    static event update updateEvent;

    static void Main(string[] args)
    {
        Console.WriteLine("Parent thread: " + Thread.CurrentThread.ManagedThreadId);
        updateEvent += new update(Test_updateEvent);
        var t = new Thread(
            () =>
            {
                Console.WriteLine("Child thread: " + Thread.CurrentThread.ManagedThreadId);
                updateEvent();
            });
        t.Start();
        t.Join();
    }

    static void Test_updateEvent()
    {
        Console.WriteLine("Event thread: " + Thread.CurrentThread.ManagedThreadId);
    }
}

打印:

Parent thread: 1
Child thread: 3
Event thread: 3
于 2012-09-18T15:14:53.920 回答
0

您可以检查ManagedThreadId属性http://msdn.microsoft.com/en-us/library/system.threading.thread.managedthreadid.aspx

@Mike 这是示例

        Console.WriteLine("Main New Thread : {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);

        new System.Threading.Thread(() =>
        {
            Console.WriteLine("Inside New Thread : {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
        }).Start();

        Console.WriteLine("Main New Thread : {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
于 2012-09-18T14:37:05.843 回答