アップロードとダウンロードの進行状況の確認 - .NET SDK
同期の進行状況とステータスの監視
アプリ内の同期操作のステータスを確認したい場合があります。 例えば、すべてのデータが App Services と同期された後にのみ特定のコードを実行したい場合があるかもしれません。 また、同期操作のステータスをユーザーに提供することもできます。
変更がアップロードまたはダウンロードされるまで待機するように同期セッションを設定できます。 また、同期接続ステータスが変更されたときに通知するように同期セッションを構成することもできます。
変更がアップロードまたはダウンロードされるまで待機する
変更が完了するまで非同期に待機するには、 Realms.Sync.SyncSessionプロパティから同期セッションを取得し、 Session.WaitForUploadAsync() メソッドまたはsession.WaitDownloadAsync ()メソッドを呼び出します。 例:
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
メソッドは次の 2 つのパラメータを取ります。
Upload
またはDownload
に設定できるADirectgressionパラメータ。プログレス モードパラメーター。コールバックが登録されていないまで通知を継続するには
ReportIndefinitely
に設定し、現在転送可能なバイトのみが同期されるまで通知を継続するにはForCurrentlyOutstandingWork
に設定します。
を サブスクライブ する場合 通知に受信する SyncProgress オブジェクトは、転送される残りのデータの割合の推定値を から01 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
オブジェクトと Property ChangedEventArgs を受け取ります オブジェクト。イベント ハンドラーで、送信元を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 } } }