2011-01-03 5 views
0

Я хочу измерить время, затраченное на то, чтобы клиент получал данные по tcp с помощью C#.Как измерить время, затраченное на C# NetworkStream.Read?

Im using NetworkStream.Read читать 100 мегабит данных, которые отправляются с использованием NetworkStream.Write. Я устанавливаю буфер на один и тот же размер данных, поэтому нет проблемы с переполнением буфера и т. Д. Обычно это выглядит так.

Stopwatch sw = new Stopwatch(); 
sw.Start(); 
stream.Read(bytes, 0, bytes.Length); 
sw.Stop(); 

Проблема заключается в том, существует вероятность того, когда отправитель hasnt фактически отправил данные, но секундомер уже запущен. как я могу точно измерить время, затрачиваемое на получение данных? я попытался использовать временную задержку удаленного потока pc.Write, но время, которое потребовалось, чтобы написать, крайне мало. Кстати, секундомер - самый точный инструмент для этой задачи?

ответ

1

Одним из подходов, которые вы можете предпринять, является начало считывания данных и запуск секундомера в зависимости от доступности данных путем обработки событий. Зарегистрируйте событие, которое будет запущено, когда будут доступны данные. Это потребует тщательного подхода к разработке, например, отбрасывания исходных и окончательных ненужных данных.

1

В Сетевом потоке нет событий для отображения данных. Все, что у вас есть, это DataAvailable property, которые вы можете использовать для опроса. Например,

do { 
    // sleep for some time 
} 
while(stream.DataAvailable); 
Stopwatch sw = new Stopwatch(); 
sw.Start(); 
stream.Read(bytes, 0, bytes.Length); 
sw.Stop(); 
+0

Угадайте вы намеревались написать 'в то время как Thread.Sleep (100) (stream.DataAvailable!);' – jgauffin

+0

@jguaffin, да вот намерение. Ответ отредактирован для put ';' после while do {} while. – VinayC