C#等待一个事件

标签 c# asynchronous asp.net-core

<分区>

我正在为旧的照明控制台开发 .NET Core 中的接口(interface),目前正在实现数据包。此接口(interface)/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;
}

那么有没有什么方法可以更快/更好地做到这一点而不损失性能?

最佳答案

这将是 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;
}

关于C#等待一个事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55523946/

相关文章:

asynchronous - 后端异步有什么好处?

python - 当我的 multiprocessing.pool.apply_async 次数超过我的处理器时会发生什么

c# - 属性路由继承

c# - 通过依赖注入(inject)获取 dbcontexts 背后的 10 多个 razor 页面代码

c# - WebAPI 不尊重授权属性的 Jwt token

c# - 捕获 COMException 特定的错误代码

c# - 找不到类型或命名空间名称

node.js - 保存异步函数的结果以供以后使用

Elasticsearch 和 Asp.Net Core

c# - 弱引用和一次性对象