2013-03-05 17 views
5

I StreamSocket ve DataWriter kullanarak yükleme yapan bir WinRT uygulama var. Yüklemenin aldığı süreyi izler ve daha sonra iş hacmini hesaplar.WinRT StreamSockets ile paket yükleme onayı nasıl alınır?

sorunu yaşıyorum ben Wireshark gösterileri çok daha yüksek throughputs alıyorum olmasıdır. Bunun nedeni, yükleme döngümümün WinRT çerçevesinin verileri gerçekte ağ katmanına göndermesinden önce bitiş zaman damgasını bitirmesi ve almasıdır. Bu çerçeveden, paketlerin aslında ağ katmanına yaptığı onaylama yöntemini bulamadım. DataWriterStoreAsync yöntemi, sakladığınızdan önce tanıdığım bayt sayısını verir. Windows Phone gibi

Diğer çerçeveler, sizin paket gönderildikten sonra tetiklenir ve yüklediğiniz kaç bayt anlatır alır yerde bir geri arama var. WinRT'de herhangi bir eşdeğer bulamadım ve StoreAsync işlevinde kaç bayt çalıştığımı kaydeden bir döngü için yerleştirmek zorunda kaldım.

aslında ağ katmanına gönderildikten sonra ve kaç bayt çerçevesinde onay almak için bir yolu var mı?

GÜNCELLEME: @ polkduran'ın önerilerini denedim ve bazı paket kayıplarını azaltmaya yardımcı olurken, daha küçük dosya yüklemelerinde (100KB) önemli ölçüde paket kaybı yaşıyorum. Daha büyük dosyalar (4MB ve 10MB) için, tüm paketler gönderilir, ancak bitiş zamanı, birkaç saniye kadar kapalıdır, bu da hesaplama hesaplamasını önemli ölçüde (Wireshark izleriyle karşılaştırıldığında) çarpmaktadır. Tahminim, gerçek paket yükleme onayını sağlamaktan ziyade, geri yüklemeler yüklemeleri birazcık yavaşlattı.

Hala bu sorununa çözüm arıyorum.

DÜZENLEME: Bu konuda Microsoft ile bir destek bileti yarattı. Onların resmi yanıtı, bir paketin gerçekten yüklendiğini doğrulamak için WinRT çerçevesinin hiçbir yolu yoktur.

cevap

2

Ben denemedim ama DataWritter nesnenin StoreAsync yöntemi tarafından döndürülen DataWriterStoreOperation yılında Completed geri arama özelliğine bir işleyici atayabilirsiniz.

Ya

Bir IAsyncOperationWithProgress işlemi dönmek için StreamSocket den OutputStream özelliğinden doğrudan WriteAsync yöntemle kullanabilirsiniz.

+1

Evet! İlk öneriniz çözümdü. Her bir paketi göndermek ve bir döngü içinde göndermek yerine kendisini çağırmak için döndürülen 'DataWriterStoreOperation 'nesnesinin' Tamamlandı 'geri çağrısını kullanabildim. Geridönüş işlevine iletilen IAsyncOperation 'parametresi, size gönderilen baytları veren' GetResults' adlı bir yönteme sahiptir. Tam olarak aradığım şey bu. Çok teşekkür ederim! Bu benim için muazzam bir yardım oldu. – jokeefe

+0

Maalesef çok erken konuştum. Bu çözümlerden hiçbiri problemi tamamen düzeltmez. İlk testimde, bunu bir HTTP yükleme uygulamasında kullandım, bu yüzden kod gerçekten tamamlanmadan önce sunucudan 200 Tamam'ı almayı bekliyordu, bu da tam zamanı beklemeye zorladı. Bunu bir FTP yüklemesinde gerçekleştirmeye çalıştıktan sonra, daha küçük dosya boyutları yüklediğimde (100KB), sunucunun tüm paketleri almasından önce tam yüklemeyi tamamlamaya devam etti. Sanırım tüm bunlar biraz yavaşladı, ama doğru paket yükleme onayı değil. – jokeefe