Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.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#_.net_.net Core - Fatal编程技术网

用于多个事件处理程序的C#异步事件

用于多个事件处理程序的C#异步事件,c#,.net,.net-core,C#,.net,.net Core,我对事件和同步有一些困惑。我在.NETCore3.1中工作。我知道有多个事件处理程序需要彼此异步执行,但在联机进行一些研究之后,我不确定这些操作是否是异步的,它们必须是异步的。有C语言异步操作知识的人能给我一些指导吗?以下是基本设置: public class ReceiveClass { public EventHandler<MyEventArgs> OnReceive; public void Receive(object myData) {

我对事件和同步有一些困惑。我在.NETCore3.1中工作。我知道有多个事件处理程序需要彼此异步执行,但在联机进行一些研究之后,我不确定这些操作是否是异步的,它们必须是异步的。有C语言异步操作知识的人能给我一些指导吗?以下是基本设置:

public class ReceiveClass {
    public EventHandler<MyEventArgs> OnReceive;
    public void Receive(object myData) 
    {
         // some processing
         OnReceive?.Invoke(new MyEventArgs { Data = myData });
    }
}
公共类接收类{
公共事件处理程序OnReceive;
公共无效接收(对象myData)
{
//一些加工
OnReceive?.Invoke(newmyeventargs{Data=myData});
}
}

Receive方法可以异步调用,eventhandler可能有多个侦听器。侦听器是异步调用还是同步调用?如果是同步的,如何使其异步?

将为事件的所有“订阅者”同步运行.Invoke部分。如果您希望在每个订阅服务器上异步执行某些操作,您可以自由执行


但是,如果您的应用程序要求异步运行调用,本节已经有讨论了如果您不想被事件处理程序阻止,可以从
线程池
线程调用它们,方法是:


这意味着处理程序抛出的任何异常都将保持不被观察。

什么是“可以异步调用Receive方法”?你是说在非UI线程上?在任务中。运行?顺便说一句:你可以测试一下。加入一些日志记录,包括线程ID…它是在任务中的非UI线程上调用的。运行
public void Receive(object myData) 
{
     // some processing
     var handler = OnReceive;
     if (handler != null)
     {
         var fireAndForget = Task.Run(handler.Invoke(new MyEventArgs { Data = myData }));
     }
}