Похоже, что этот поток проливает некоторый свет на большие потоки байтов:
http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/1af59645-cdef-46a9-9eb1-616661babf90/
При использовании 10 потоков для одновременной отправки 250 МБ файлов вы можете на самом делене хватит памяти!Какую спецификационную машину вы используете?
ОБНОВЛЕНИЕ
Я все для того, чтобы попробовать, вот что я и сделал.Я создал аккаунт на Rapidshare, но мне стало скучно читать о сложностях загрузки API.Поэтому я не совсем уверен, работает этот код или нет.Тем не менее, он запускает .Я заметил, что выполнение вашего кода выше, похоже, ничего не делает делать во время чтения файла.Однако, как только вызывается GetResponseStream
, появляется возможность загрузить файл тут же.Хм, мы не хотим загружать его во время процесса потокового чтения.
Итак, я попробовал предложение на Блоге Джеффри Рихтера и быстро просмотрел здесь также длянекоторые другие примеры загрузки.Теперь я заявил выше, что не углублялся в сложности RapidShares upload api, а не в саму потоковую операцию.
См. Код ниже.Он идентичен, кроме введения MemoryStream
для информации заголовка, и я также удалил содержимое нижнего колонтитула (чтобы получить правильное количество байтов).
Dim ms As New MemoryStream()
Dim formDataTemplate As String = "Content-Disposition: form-data; name=""{0}""{1}{1}{2}"
For Each key As String In otherParameters.Keys
ms.Write(boundaryBytes, 0, boundaryBytes.Length)
Dim formItem As String = String.Format(formDataTemplate, key, newLine, otherParameters(key))
Dim formItemBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(formItem)
ms.Write(formItemBytes, 0, formItemBytes.Length)
Next key
ms.Write(boundaryBytes, 0, boundaryBytes.Length)
Dim headerTemplate As String = "Content-Disposition: form-data; name=""{0}""; filename=""{1}""{2}Content-Type: {3}{2}{2}"
Dim header As String = String.Format(headerTemplate, fileParameterName, filePath, newLine, contentType)
Dim headerBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(header)
ms.Write(headerBytes, 0, headerBytes.Length)
Dim length As Long = ms.Length
length += New FileInfo(filePath).Length
request.ContentLength = length
Using requestStream As IO.Stream = request.GetRequestStream()
Dim bheader() As Byte = ms.ToArray()
requestStream.Write(bheader, 0, bheader.Length)
Using fileStream As New IO.FileStream(filePath, IO.FileMode.Open, IO.FileAccess.Read)
Dim buffer(4096) As Byte
Dim bytesRead As Int32 = fileStream.Read(buffer, 0, buffer.Length)
Do While (bytesRead > 0)
requestStream.Write(buffer, 0, bytesRead)
bytesRead = fileStream.Read(buffer, 0, buffer.Length)
Loop
End Using
requestStream.Close()
End Using
Весь смысл этого заключался в предварительном выделениисвойство ContentLength
, поэтому оно начинает потоковую передачу немедленно.Вместо того, чтобы выполнять работу на GetResponseStream
, он выполняет работу на команде requestStream.Write
.Байты в MemoryStream
подсчитываются, затем записываются, затем размер файла добавляется к переменной length
и устанавливается как ContentLength
.Это работает?!