2012-12-12 7 views
7

私は、C#を使用してTwitterストリームAPIからデータを読み取ろうとしていますが、APIがデータを返さないことがあるため、私はストリームが次の日または2の間にそれ以上のデータを返さない場合には、読者に1バイト以上のバッファ長を使用することを躊躇してきました。一度に1バイトを読み取らずにHTTPストリームを消費する

私は次の行使用されている

input.BeginRead(buffer, 0, buffer.Length, InputReadComplete, null); 
//buffer = new byte[1] 

は今、私がアプリケーションをスケールアップすることを計画していること、私は1のサイズは、CPU使用率の多くになりますと思うし、その数を増やしたいですしかし、私はまだストリームをブロックしたくない。次の5秒間にそれ以上のバイトが読み込まれない場合、ストリームを返すことは可能ですか?

答えて

4

asyncオプション

何のバイトは、例えばのために受信されない場合は、操作を完了するために、非同期コールバックメソッドでタイマーを使用することができます5秒。バイトが受信されるたびにタイマーをリセットします。 BeginReadの前に起動してください。

同期オプション

代わりに、読み取りを完了する前に待機する最大時間を確立するために、基盤となるソケットのReceiveTimeoutというプロパティを使用することができます。より大きなバッファを使用し、タイムアウトを例えばに設定することができます。 5秒。

MSDN documentationから、そのプロパティは同期読み取りにのみ適用されます。別のスレッドで同期読み取りを実行できます。

UPDATE

はここで同様の問題からつなぎ合わせてラフ、未テストコードです。それはおそらく実行されません(または、バグフリー)が、あなたのアイデアを与える必要があります:

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(); 
} 
+0

Twitterのポリシーのために接続を開いたり閉じたりすることができません。非同期コールバックタイマーを使用して読み込みを早期に終了する方法の例を挙げることはできますか? – HenryZhang

+0

@huadianz:出発点を与えるための大まかな例を追加しました。 –

+0

Readはバッファ内のデータを返しますか、またはそのデータは失われていますか? – HenryZhang

関連する問題