Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这些事件回调将在哪个线程上发生?_C#_Multithreading_Visual Studio 2010 - Fatal编程技术网

C# 这些事件回调将在哪个线程上发生?

C# 这些事件回调将在哪个线程上发生?,c#,multithreading,visual-studio-2010,C#,Multithreading,Visual Studio 2010,第1部分:假设我在winforms应用程序的主UI线程上运行上述代码。对SomeMethod的调用将发生在哪个线程上?它们会出现在我创建对象时创建的同一线程上吗 第2部分:使用Visual Studio 2010,我如何自己解决这个问题?我不知道从哪里可以找到什么线程正在运行。事件处理程序SomeMethod将在引发事件的任何线程上运行 您可以在事件处理程序SomeMethod中设置断点,并查看(您可能希望为线程指定有意义的名称以查找它们)。要查找当前正在执行的线程,可以使用thread.Cur

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


第2部分:使用Visual Studio 2010,我如何自己解决这个问题?我不知道从哪里可以找到什么
线程
正在运行。

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


您可以在事件处理程序
SomeMethod
中设置断点,并查看(您可能希望为线程指定有意义的名称以查找它们)。

要查找当前正在执行的线程,可以使用
thread.CurrentThread.ManagedThreadId

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


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

您可以检查ManagedThreadId属性

@迈克,这是样品

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

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

        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);
    }
}

啊,我明白了。所以,如果我想确保
SomeMethod
在一个新的
线程上运行
,那么像这样做会被认为是好的实践吗<代码>新线程(()=>this.SomeEvent.Invoke(this,neweventargs()).Start()
当我想要实际引发事件时?@michael.mankus,如果您想要在单独的线程上运行事件,请使用
BeginInvoke
/
EndInvoke
方法或
Tasks
而不是新建
thread
对象。尽管事件通常不是这样完成的,但如果需要,通常是事件处理程序负责进行后台工作,否则可能会导致处理程序可重入。如果你真的想让你的事件在后台自动引发,请确保它有明确的文档记录。另外,请查看这本专门关于C#线程的电子书:我明白你的意思,如果需要,谁通常有责任做后台(线程化)工作。接下来,我将正常调用事件,如果需要,我将在处理程序中创建一个后台任务。有道理。这个答案已经由@Daniel提供了,因此没有增加任何价值。
Parent thread: 1
Child thread: 3
Event thread: 3