Как дождаться окончания записи потока - PullRequest
1 голос
/ 31 августа 2011

У меня есть серверное приложение, которое прослушивает соединения через порт 8888. Я также создаю клиентское приложение. Это простое приложение, единственная сложность которого заключается в управлении несколькими соединениями. поэтому мне просто нужно передавать файлы между компьютерами, поэтому, как я это делаю, я не знаю, правильно ли это, но это работает, может быть, вы, ребята, можете исправить меня. Вот мой алгоритм при отправке файла:

NetworkStream stream = \\ initialize it

while(someCondition)
{
  // first I open the file for reading and read chunks of it
  byte[] chunk = fileRead(file, indexStart, indexEnd) // I have a similar method this is just to illustate my point

  stream.Write(chunk, \\other params)

   // since I often send large files it will be nice if I can wait here 
   // until the stream.Write is done. when debuging this the while loop 
   // executes several times then it waits. 

}

а с другой стороны я читаю байты из этого потока и записываю его в файл.

Мне также иногда нужно подождать, потому что я отправляю несколько файлов и хочу убедиться, что первый файл был отправлен, прежде чем перейти к следующему. Я знаю, что могу решить эту проблему с помощью метода stream.Read после завершения передачи. и отправка данных обратно от клиента. но иногда я верю, что будет полезно узнать, когда закончится stream.write.


Редактировать

хорошо, поэтому, основываясь на ваших ответах, я могу, например, отправить клиенту количество байтов, которые я планирую отправить. и как только клиент получает столько байтов, это означает, что это сделано. Но мой вопрос, если это эффективно. Я имею в виду делать что-то вроде

на сервере:

запись данных "отправка длины файла"

читать данные «проверить, получил ли клиент длину» (например, ожидая строку в порядке)

записать данные "tel клиенту имя файла"

read data «проверить, получил ли клиент имя файла»

записать данные "начать отправку фрагментов файла"

чтение данных "дождитесь, пока клиент ответит строкой ok, например"

Ответы [ 2 ]

5 голосов
/ 31 августа 2011

Запись завершается, когда завершается строка

stream.Write(chunk, \\other params)

.Стоит отметить, что это не означает, что другой конец получил что-либо.Фактически, непосредственно после этой строки, данные, вероятно, находятся в некотором буфере на отправляющем компьютере.Это означает, что теперь это вне вашего контроля.Если вы хотите подтверждение получения, удаленный конец должен сообщить вам.

3 голосов
/ 31 августа 2011

Stream.Write является синхронным, поэтому он всегда будет блокировать ваш поток до завершения записи.

...