C#等待事件发生

C#等待事件发生,c#,asynchronous,asp.net-core,C#,Asynchronous,Asp.net Core,我正在为一个旧的照明控制台在.NETCore中开发一个接口,目前正在实现这些包。此接口/API的基本思想如下:客户端在一个UDP端口上发送其数据包,控制台使用错误代码进行响应。控制台通过另一个UDP端口发送其数据包 因此,在设计API时,我只使用了操作作为回调函数。但这种方法在一次处理多个数据包时并不实用 我的UdpClient在接收数据包时引发了一个事件,但控制台返回的错误代码不超过4字节 所以我尝试了使用信号量lim 我的想法是让发送方等待事件发生并释放信号量。 基本上,问题是这是否是处理此

我正在为一个旧的照明控制台在.NETCore中开发一个接口,目前正在实现这些包。此接口/API的基本思想如下:客户端在一个UDP端口上发送其数据包,控制台使用错误代码进行响应。控制台通过另一个UDP端口发送其数据包

因此,在设计API时,我只使用了
操作
作为回调函数。但这种方法在一次处理多个数据包时并不实用

我的UdpClient在接收数据包时引发了一个事件,但控制台返回的错误代码不超过4字节

所以我尝试了使用
信号量lim

我的想法是让发送方等待事件发生并释放信号量。 基本上,问题是这是否是处理此问题的最快和“最干净”的方法:

//事件回调:
私有无效发送方\接收方(对象发送方,错误代码e)
{
lastError=e;
semaphore.Release();
}
//SendPacket方法:
公共异步任务SendPacketAsync(数据包)
{
//发送数据包
wait semaphore.WaitAsync();
返回lastError;
}

那么,有没有办法更快/更好地执行此操作而不损失性能?

这将是一个很好的用途,它允许您设置一个等待对象,并在回调中设置它,向等待者发出信号

TaskCompletionSource<ErrorCode> source = null;

private void Sender_Recieve(object sender, ErrorCode e)
{
    source.SetResult(e);
}

public async Task<ErrorCode> SendPacketAsync(Packet packet)
{
    source = new TaskCompletionSource<ErrorCode>();
    //send packet
    return await source.Task;
}
TaskCompletionSource=null;
私有无效发送方\接收方(对象发送方,错误代码e)
{
来源:SetResult(e);
}
公共异步任务SendPacketAsync(数据包)
{
source=新任务完成源();
//发送数据包
返回等待源。任务;
}