У меня есть код ниже, который я использую для загрузки файлов на мою страницу 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
код работал, я хочу < / strong> заблокировать его до завершения отправки (позже я могу поместить все это в отдельный поток).
Я загрузил множество примеров для этого, и они либо не работают должным образом с моим обработчиком файлов ashx (я не могу его изменить), либо они используют метод WebClient, который просто сообщает о 50% прогрессе.