簡體   English   中英

這些事件回調會發生在什么線程上?

[英]What thread will these event callbacks occur on?

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

第1部分:假設我在winforms應用程序中的主UI線程上運行上面的代碼。 哪個Thread會調用SomeMethod 它們是否會出現在我創建對象時創建的同一個Thread上?

第2部分:使用Visual Studio 2010,我如何自己解決這個問題? 我不知道你在哪里找到Thread運行的東西。

事件處理程序SomeMethod將在引發事件的任何線程上運行。

您可以在事件處理程序SomeMethod設置斷點並查看“ 線程”窗口 (您可能希望為線程提供有意義的名稱以查找它們)。

要找出當前正在執行的線程,可以使用Thread.CurrentThread.ManagedThreadId

回答你的問題:SomeMethod將在引發事件的線程中執行。

在您的情況下,它實際上永遠不會執行,因為您將方法分配給事件但從未實際引發事件。

您可以查看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);

只是想添加一個簡單的測試,它將允許您檢查處理程序執行的線程:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM