c# - 调用异步方法与事件

标签 c# events async-await

我正在为网络应用程序协议(protocol)开发客户端库。

客户端代码调用库来初始化它并连接到服务器。 客户端当然可以向服务器发送请求,但服务器也可以向客户端发送请求(Commands,以下称为Cmd)。

传输协议(protocol)是 TCP/IP,所以基本上客户端库连接到服务器并调用异步方法从服务器检索下一个请求或响应,以避免在等待响应时发生 I/O 阻塞/来自服务器的请求。

话虽如此,我在库中看到了两种可能的解决方案(仅使用 C# 构造,没有特定的第三方框架)以允许客户端接收来自服务器的请求:

要么在图书馆提供一个事件,例如

public EventHandler<ReceivedCmdEventArgs> event ReceivedCmd;

客户端会订阅,以便收到来自服务器的请求通知。 当然,对于这种机制,我必须在客户端库中创建一个异步循环以接收来自服务器的请求并在 Cmd 接收时引发事件。

或者另一种解决方案是在客户端库中创建这样的方法

public async Task<Cmd> GetNextCmdAsync()

客户端代码将在异步循环中调用以接收命令。

这些解决方案是否相同?完全使用 C#5 的 async/await constrcuts 而不再依赖事件是否更好?有什么区别 ?有什么建议,评论吗?

谢谢!

最佳答案

我认为事件驱动方法更适合您的情况。

事实上,您在谈论可观察/观察者模式。 未知数量的监听器/观察器正在等待在收到某些命令时执行某项操作。

Async/await 模式不会像事件驱动方法那样有效,因为它类似于I expect one result 而不是I'll do what you want每当你向我报告你收到命令时

从概念上讲,我更喜欢事件驱动的方法,因为它更适合您的架构目标。

C# 5 中的 Async/await 模式不是为您的情况而设计的,但它适用于某些代码执行异步任务并且下一个代码行应该在任务收到结果后执行的情况。

关于c# - 调用异步方法与事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12036156/

相关文章:

c# - VS2010 中的混合项目解决方案-托管和 native

c# - ASP.NET Core 识别 Auth + Angular : Login Not Working

c# - 在异步方法中不等待任务的注意事项

c# - DataGrid wpf MVVM 内的按钮

c# - 如何防止异步方法可重入?

angular - Angular 中的 Async/await 或 Observable

c# - 关于多对多关系的OO问题(NHibernate的规划)

c - SDL 窗口未正确关闭

javascript - Android 浏览器上的滚动事件未触发。需要解决方法

Azure Function : When Function AutoScale, 函数被多次调用