У меня есть код, который я использую для загрузки файлов на мою страницу Ashx. Это прекрасно работает, хотя я не могу найти правильный способ получить сумму, которую он перечислил.
Телефонный код:
WebClient wc = new WebClient();
wc.OpenWriteCompleted += (s2, e2) =>
{
PushData(e2.Result, offset);
e2.Result.Close();
};
wc.OpenWriteAsync(ub.Uri);
Код данных push:
private void PushData(Stream output, long offset)
{
byte[] buffer = new byte[4096];
int bytesRead;
bytesRead = theFileStream.Read(buffer, 0, buffer.Length);
if (bytesRead != 0)
{
output.Write(buffer, 0, bytesRead);
totalBytesDone += bytesRead;
FireUpdateEvent(bytesRead);
}
}
Приведенный выше код немного отличается от моего реального кода, для краткости.
Теперь я предположил, что когда он достигнет output.Write(buffer,0,bytesRead);
, это был тот момент, когда он отправлял реальные данные, и он блокировался и переходил к следующей строке только после того, как закончил писать этот раздел. Но это продолжается до totalBytesDone += bytesRead;
до того, как что-то записано на сервер. Я предполагаю, что причина в том, что он выполняет запись в отдельном потоке в фоновом режиме (или я на самом деле смотрю на неправильный раздел кода, и он пишет в другом месте) - но для того, чтобы мой totalBytesDone
код работал, я хочу заблокировать его до окончания отправки (я могу поместить это все в отдельный поток позже).
Я скачал множество примеров для этого, и они либо не работают должным образом с моим обработчиком файлов ashx (я не могу изменить его), либо они используют метод WebClient, который просто сообщает о прогрессе в 50%.