1

我正在编写一个 API,用于从另一个应用程序接收一些数据。目前,该功能旨在阻止直到接收到数据。在我看来,这限制了使用 API 的开发人员使用多线程或某种多进程设计。那么,一个函数是阻塞还是返回一个空值,然后休眠几毫秒,然后再试一次更好。

请注意,其他应用程序可能在未知的时间段内没有任何数据要通过 API 发送。

API 是用 C++ 编写的

4

6 回答 6

3

为什么不使用回调

于 2009-12-02T20:18:09.643 回答
1

考虑另一种选择:使用异步事务 -> 发出一个request& 提供一个callback addresswithticket id。当响应可用时,服务端点将callbacks您的应用程序与ticket id您的结果和 ;-)

你应该尽可能避免阻塞。


正如你所说:

请注意,其他应用程序可能在未知的时间段内没有任何数据要通过 API 发送。

在这种情况下,使用同步接口会不必要地占用资源。

于 2009-12-02T20:19:30.063 回答
1

您可以定义 API 以允许用户传递可选的超时值。如果未指定超时,则 API 函数会无限期地等待,就像select()工作原理一样。

于 2009-12-02T20:22:05.957 回答
0

您还没有说这是什么语言,但听起来您的 API 正在侦听或检查某些事件,并且 API 的用户正在阻止或轮询您的 API 以确定事件是否发生?

是否可以使用回调?API 的用户将注册事件发生的通知,当您的库检测到事件时,它将使用回调通知所有侦听器。

于 2009-12-02T20:18:07.520 回答
0

当您的应用程序调用 O/S api 函数read()时,您希望它阻塞吗?你当然可以——至少默认情况下是这样。在某些情况下,ioctl 允许程序员将行为更改为异步,这在网络应用程序中尤其常见。

您对 API 的含义了解甚少,因此请考虑:

  • API 用户想要被阻止是否有意义?也就是说,在它返回之前没有什么可做的。
  • 如果您正在为 API 编写应用程序,您希望它做什么?您绝对应该为自己的教育编写一些示例应用程序,并记录 API。
  • API 用户是否有任何理由不会对 API 进行多线程(或分叉等)请求?
于 2009-12-02T20:25:04.313 回答
0

如果您想要一个可重用的解决方案,您可以应用 .NET 中常见的异步设计“模式”,但也可以在 C++ 中实现,如本 CodeProject 项目所示

对接口中的同一特性同时提供同步和异步调用没有任何问题。

就个人而言,如果我需要为多个请求提供服务(例如,在这种情况下,您可以对“BeginOperation”请求进行排队),或者接口中有许多潜在的异步操作(我想要一个标准化的、灵活的模式),我只会使用这些长度。如果您一次只能处理一个请求,则超时通常就足够了。

于 2010-01-14T11:17:37.163 回答