我正在编写一个 API,用于从另一个应用程序接收一些数据。目前,该功能旨在阻止直到接收到数据。在我看来,这限制了使用 API 的开发人员使用多线程或某种多进程设计。那么,一个函数是阻塞还是返回一个空值,然后休眠几毫秒,然后再试一次更好。
请注意,其他应用程序可能在未知的时间段内没有任何数据要通过 API 发送。
API 是用 C++ 编写的
为什么不使用回调?
考虑另一种选择:使用异步事务 -> 发出一个request
& 提供一个callback address
withticket id
。当响应可用时,服务端点将callbacks
您的应用程序与ticket id
您的结果和 ;-)
你应该尽可能避免阻塞。
正如你所说:
请注意,其他应用程序可能在未知的时间段内没有任何数据要通过 API 发送。
在这种情况下,使用同步接口会不必要地占用资源。
您可以定义 API 以允许用户传递可选的超时值。如果未指定超时,则 API 函数会无限期地等待,就像select()
工作原理一样。
您还没有说这是什么语言,但听起来您的 API 正在侦听或检查某些事件,并且 API 的用户正在阻止或轮询您的 API 以确定事件是否发生?
是否可以使用回调?API 的用户将注册事件发生的通知,当您的库检测到事件时,它将使用回调通知所有侦听器。
当您的应用程序调用 O/S api 函数read()
时,您希望它阻塞吗?你当然可以——至少默认情况下是这样。在某些情况下,ioctl 允许程序员将行为更改为异步,这在网络应用程序中尤其常见。
您对 API 的含义了解甚少,因此请考虑:
如果您想要一个可重用的解决方案,您可以应用 .NET 中常见的异步设计“模式”,但也可以在 C++ 中实现,如本 CodeProject 项目所示。
对接口中的同一特性同时提供同步和异步调用没有任何问题。
就个人而言,如果我需要为多个请求提供服务(例如,在这种情况下,您可以对“BeginOperation”请求进行排队),或者接口中有许多潜在的异步操作(我想要一个标准化的、灵活的模式),我只会使用这些长度。如果您一次只能处理一个请求,则超时通常就足够了。