检查上传和下载进度 - .NET SDK
监控同步进度和状态
您可能想知道应用程序中同步操作的状态。 例如,您可能希望仅在所有数据与 App Services 同步后才运行特定代码。 您可能还想为用户提供同步操作的状态。
您可以将 Sync 会话设置为等待上传或下载更改。 您还可以将同步会话配置为在 Sync 连接状态发生变化时发出通知。
等待上传或下载更改
要异步等待更改完成,请从 Realms.Sync.SyncSession属性获取同步会话,然后调用session.WaitForUploadAsync()或session.WaitForDownloadAsync()方法。 示例:
using Realms.Sync; var realm = Realm.GetInstance(config); await realm.SyncSession.WaitForDownloadAsync();
监控同步进度
..versionchanged:: 12.0.0
注意
尚不完全支持 Flexible Sync 进度通知。 使用Flexible Sync时,仅在集成更改后下载报告通知。 基于分区的同步在下载变更时提供持续通知。 上传报告两种同步模式的持续进度通知。
要监控同步进度,请从Realms.Sync.SyncSession属性获取同步会话,然后通过调用session.GetProgressObservable()方法添加进度通知。
session.GetProgressObservable
方法接受以下两个参数:
可设立为
Upload
或Download
的ProgressDirection参数。ProgressMode参数,可设立为
ReportIndefinitely
,以便通知继续,直到取消注册回调;或者设置为ForCurrentlyOutstandingWork
,让通知继续,直到仅同步当前可传输的字节。
当您 订阅 对于通知,您会收到一个 SyncProgress 对象,该对象以介于0 和1 0之间的值形式提供要传输的剩余数据百分比的估计值。 。
例子
在以下示例中,我们订阅session
上的进度可观察量以侦听上传事件。 当触发此回调时,它会以百分比形式打印上传进度。
var session = realm.SyncSession; var token = session.GetProgressObservable(ProgressDirection.Upload, ProgressMode.ReportIndefinitely) .Subscribe(progress => { Console.WriteLine($@"Current upload progress: {progress.ProgressEstimate * 100}%"); }); token.Dispose();
一旦您不再希望接收通知,请使用token.Dispose()
取消注册令牌。
获取连接状态更改
要获取SyncSession的连接状态,请对PropertyChanged事件设立事件处理程序。 事件处理程序是标准.NET PropertyChangedEventHandler 委托 接受sender
对象和 PropertyChangedEventArgs 对象。在事件处理程序中,将发送者转换为Session
对象,并检查事件参数的PropertyName
属性是否为Session.ConnectionState
。 然后,您可以获得ConnectionState值,该值将是以下值之一:
正在连接
可连接
断开连接
以下代码演示了如何设置事件处理程序、转换会话对象以及检查同步状态:
public void SetupRealm() { var appConfig = new AppConfiguration(myRealmAppId); app = App.Create(appConfig); user = app.LogInAsync(Credentials.Anonymous()).Result; config = new PartitionSyncConfiguration("myPartition", user); try { var realm = Realm.GetInstance(config); var session = realm.SyncSession; session.PropertyChanged += SyncSessionPropertyChanged!; realm.Dispose(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } private void SyncSessionPropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(Session.ConnectionState)) { var session = (Session)sender; var currentState = session.ConnectionState; if (currentState == ConnectionState.Connecting) { //session is connecting } if (currentState == ConnectionState.Connected) { //session is connected } if (currentState == ConnectionState.Disconnected) { //session has been disconnected } } }