关于NSUrlSessionTaskDelegate DidSendBodyData中totalBytesSent上传进度乱序的问询
NSUrlSessionTaskDelegate DidSendBodyData 中 totalBytesSent 乱序的问题
结论
DidSendBodyData回调里的totalBytesSent出现乱序是已知的预期行为,你无法依赖该值的严格递增顺序。
原因说明
即使将HttpMaximumConnectionsPerHost设置为1,底层网络传输的机制(比如TCP数据包重传、滑动窗口动态调整、系统内部缓存调度逻辑)仍可能导致回调触发顺序与字节实际发送顺序不完全匹配,进而出现totalBytesSent数值波动的情况。这种乱序在小文件上传中出现1-3次属于正常现象。
解决建议
如果需要展示准确的上传进度,建议自行维护全局的已发送字节最大值,每次回调时取当前totalBytesSent与该最大值的较大值作为有效进度值,示例代码如下:
public class TestUploadDelegate : NSUrlSessionTaskDelegate { private long _maxTotalBytesSent = 0; public override void DidSendBodyData(NSUrlSession session, NSUrlSessionTask task, long bytesSent, long totalBytesSent, long totalBytesExpectedToSend) { _maxTotalBytesSent = Math.Max(_maxTotalBytesSent, totalBytesSent); Console.WriteLine($"有效totalBytesSent {_maxTotalBytesSent}"); } }
你的测试代码
Delegate实现
// For use with NSUrlSession that is configured for HttpMaximumConnectionsPerHost = 1 public class TestUploadDelegate : NSUrlSessionTaskDelegate { public override void DidSendBodyData(NSUrlSession session, NSUrlSessionTask task, long bytesSent, long totalBytesSent, long totalBytesExpectedToSend) { Console.WriteLine($"totalBytesSent {totalBytesSent}"); } }
NSUrlSession创建代码
public NSUrlSession GetFileHostUrlSession() { if (this.fileHostUrlSession == null) { using var configuration = NSUrlSessionConfiguration.CreateBackgroundSessionConfiguration(FileHostSessionIdentifier); configuration.AllowsCellularAccess = true; configuration.WaitsForConnectivity = true; configuration.ShouldUseExtendedBackgroundIdleMode = true; configuration.SessionSendsLaunchEvents = true; configuration.Discretionary = false; configuration.HttpMaximumConnectionsPerHost = 1; // Set to 1 for testing this.fileHostUrlSession = NSUrlSession.FromConfiguration(configuration, new TestUploadDelegate() as INSUrlSessionDelegate, new NSOperationQueue()); } return this.fileHostUrlSession; }
内容的提问来源于stack exchange,提问作者Magnetic Llama
相关产品推荐
相关产品推荐

