我正在尝试在 iOS 应用程序上实现上传进度条。我当前的实现做了这个简单的技巧:
using (Stream requestStream = request.GetRequestStream ()) {
byte[] dataToUpload = this.DataToUpload;
int dataToUploadLength = dataToUpload.Length;
int uploadedSoFar = 0;
while (uploadedSoFar < dataToUploadLength) {
int toUpload = 8192;
if (uploadedSoFar + toUpload > dataToUploadLength) {
toUpload = dataToUploadLength - uploadedSoFar;
}
requestStream.Write (dataToUpload, uploadedSoFar, toUpload);
uploadedSoFar += toUpload;
this.SetUploadedRatio ((float)uploadedSoFar / (float)dataToUploadLength);
}
问题是 requestStream.Write() 是即时的,直到发送了大约 100KB 的数据,然后它变得更加合乎逻辑并且上面显示的 SetUploadedRatio() 方法被调用,就像它应该的那样。当文件很大时,这并不是什么大问题,尽管我们仍然可以看到它立即占用一些百分比,然后开始减慢百分比。在慢速连接上,发送一个 60KB 的文件会导致显示一个进度条,该进度条会立即变为 100%,但实际上传根本没有完成,所以我们无法真正显示正在发生的事情。
我做了一个暴露问题的完整展示(在 Monotouch iOS 上),链接如下: https ://github.com/rFlex/Monotouch-Upload-Showcase
这是有趣的地方: https ://github.com/rFlex/Monotouch-Upload-Showcase/blob/master/TestUpload/Uploader.cs