事件操作 在 C 语言中从不同的线程调用#

event Action Invoke from different thread in C#

提问人:renji 提问时间:11/15/2023 更新时间:11/15/2023 访问量:37

问:

public class A
{
    private B NotifyObj = new B();
    
    public A()
    {
        NotifyObj.NotifyEvent += Notified;
    }
     private async void Notified()
     {
         
     }
    
}

Class B
{
   public event Action NotifyEvent;

   public CallEvent()
   {
       NotifyEvent?.Invoke();
   }
}

在上面的代码(使用 C# WPF)中,A 类在主线程中运行,B 类在单独的线程中运行。如果主线程繁忙而其他线程调用 CallEvent(),会发生什么情况。它是要在消息队列中获取队列,还是将停止当前执行并执行此操作,然后继续上一次执行。基本上NotifyEvent?.Invoke() 的工作方式类似于 C++ 中的 Postmessage/SendMessage

C# WPF 多线程处理 事件 操作

评论

1赞 Enigmativity 11/15/2023
你对线程的工作原理有误解。当你说“A 类在主线程中运行,B 类在单独的线程中运行时”,这是不正确的。您可能已在单独的线程中实例化了它们,但它们不会在不同的线程上运行。重要的是您在实例上调用方法时使用的线程。您可以创建第三个线程并在这些实例上调用方法,它将始终使用第三个线程。
0赞 renji 11/15/2023
我知道线程是如何工作的。我只是用它来解释这个场景。我的重点是当一个繁忙的线程从另一个线程接收到事件操作时会发生什么。
0赞 Enigmativity 11/16/2023
“一个繁忙的线程从另一个线程接收事件操作”——这就是我要说的——线程不是这样工作的。你似乎不知道线程是如何工作的。

答:

1赞 Emanuele 11/15/2023 #1

如果从单独的线程调用该方法,它将在单独的线程上执行。

如果你需要强制主线程(如果不忙的话)运行一些代码,例如处理 UI,你可以检查方法。Dispatcher.Invoke

评论

0赞 renji 11/15/2023
因此,Notified() 在 NotifyEvent?.调用()?
0赞 Emanuele 11/16/2023
它应该,但如果你在回调中放置一个断点并检查当前线程,你可以尝试一下
1赞 renji 11/16/2023
event.invoke() 处理程序在与 event.invoke() 相同的线程中执行