我一直在尝试使用C#从Twitter流API中读取数据,因为有时API不会返回任何数据,而且我正在寻找近乎实时的响应,我一直犹豫是否要使用更多的缓冲区长度如果流在下一天或两天内没有再返回任何数据,则读取器上的字节数超过1个字节。
我一直在使用以下一行:
input.BeginRead(buffer, 0, buffer.Length, InputReadComplete, null);
//buffer = new byte[1]
既然我打算扩展应用程序,我认为大小为1会导致大量CPU使用,并希望增加该数量,但我仍然不希望流只是阻塞。如果在接下来的5秒内没有读取更多的字节或类似的东西,是否可以让流返回?
答案 0 :(得分:4)
异步选项
如果没有接收到例如字节,则可以在异步回调方法中使用计时器来完成操作。 5秒。每次接收字节时重置定时器。在BeginRead之前启动它。
同步选项
或者,您可以使用底层套接字的ReceiveTimeout属性来确定在完成读取之前等待的最长时间。您可以使用更大的缓冲区并将超时设置为例如5秒。
从MSDN documentation该属性仅适用于同步读取。您可以在单独的线程上执行同步读取。
<强>更新强>
这是一个粗略的,未经测试的代码拼凑在一起的类似问题。它可能不会按原样运行(或无错误),但应该给你一个想法:
private EventWaitHandle asyncWait = new ManualResetEvent(false);
private Timer abortTimer = null;
private bool success = false;
public void ReadFromTwitter()
{
abortTimer = new Timer(AbortTwitter, null, 50000, System.Threading.Timeout.Infinite);
asyncWait.Reset();
input.BeginRead(buffer, 0, buffer.Length, InputReadComplete, null);
asyncWait.WaitOne();
}
void AbortTwitter(object state)
{
success = false; // Redundant but explicit for clarity
asyncWait.Set();
}
void InputReadComplete()
{
// Disable the timer:
abortTimer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite);
success = true;
asyncWait.Set();
}