2012-12-12 14 views
7

C# kullanarak Twitter akış API'sinden veri okumaya çalışıyorum ve bazen API hiçbir veri döndürmeyecek ve neredeyse gerçek zamanlı bir yanıt arayacağım Akışın ertesi gün veya iki gün için daha fazla veri göndermemesi durumunda, okuyucuda 1 bayttan fazla bir arabellek uzunluğu kullanmakta tereddüt ettim.Bir seferde bir bayt okumadan bir HTTP akışını tüketme

Ben aşağıdaki satırı kullanarak olmuştur: Şimdi uygulamayı büyütmek planladıkları

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

, ben 1 bir boyut CPU kullanımı bir çok yol ve bu sayıyı artırmak isteyen düşünüyorum ama yine de akışın sadece engellenmesini istemiyorum. Önümüzdeki 5 saniye içinde başka bir bayt yoksa ya da benzer bir şey yoksa akışın geri dönmesi mümkün mü?

cevap

4

uyumsuz Hiçbir bayt örneğin temin edilememesi durumunda, işlemi tamamlamak için zaman uyumsuz geri arama yöntemi bir zamanlayıcı kullanabilir

Seçenek 5 saniye. Baytlar her alındığında zamanlayıcıyı sıfırlayın. BeginRead'den önce başlatın.

Alternatif

Sync Seçeneği sen okuma tamamlamadan önce beklenecek maksimum süre kurmak için altta yatan yuvasından ReceiveTimeout özelliğini kullanabilirsiniz. Daha büyük bir arabellek kullanabilir ve zaman aşımını ör. 5 saniye.

Bu özellik, MSDN documentation'dan itibaren yalnızca bir eşzamanlı okuma için geçerlidir. Ayrı bir iş parçacığında eşzamanlı okuma gerçekleştirebilirsiniz.

GÜNCELLEME

İşte aynı sorunla karşı birlikte parçalı kaba, denenmemiş kod. Muhtemelen çalıştırın (ya da böcek özgür olmak) olduğu gibi, ama size bir fikir vermelidir olmaz:

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

Sadece açılış ve çünkü Twitter'ın politikaları bağlantıyı kapatmadan devam edemez. Erken okumayı sonlandırmak için async geri arama zamanlayıcısını nasıl kullanabileceğimin bir örneğini verebilir misiniz? – HenryZhang

+0

@huadianz: Size bir başlangıç ​​noktası vermek için kaba bir örnek eklendi. –

+0

Okuma, arabellekte herhangi bir veriyi döndürüyor mu, yoksa bu veriler kayboluyor mu? – HenryZhang

İlgili konular