C#等待事件

Ner*_*rix 2 c# asynchronous asp.net-core

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

因此,在设计API时,我只是使用了Action<ErrorCode>作为回调函数。但是,当一次处理多个数据包时,此方法不是很实用。

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

所以我已经尝试过使用SemaphoreSlim

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

// The Event-Callback:
private void Sender_Recieve(object sender, ErrorCode e)
{
  lastError = e;
  semaphore.Release();
}

// The SendPacket method:
public async Task<ErrorCode> SendPacketAsync(Packet packet)
{
  // send packet

  await semaphore.WaitAsync();

  return lastError;
}
Run Code Online (Sandbox Code Playgroud)

那么,有什么方法可以更快/更好地做到这一点而又不会降低性能?

Joh*_* Wu 6

这对于TaskCompletionSource来说是一个很好的用法,它允许您设置一个可等待的对象并将其设置在回调中,向等待者发出信号。

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;
}
Run Code Online (Sandbox Code Playgroud)