2

アプリの終了/非アクティブ化時にアプリ データを保存しようとしています。WP8 では、Async メソッドのみをサポートする StorageFile を使用しました。

問題は (私がこの記事を読んで疑い、確認したように) 簡単に言えば、OS ライフサイクル イベントと非同期メソッドがうまく混ざり合わないことです。したがって、これは機能しません (async/await がなくても)

private async void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
     var dataSvc = SimpleIoc.Default.GetInstance<ICachedDataService>();
     await dataSvc.StoreCachedDataAsync();
}

この記事では 2 つの回避策を提案していますが、どちらも理想的ではないようです。

  1. 同期操作をサポートする StorageFolder/File の代わりに、IsolatedStorage などの別の API を使用します。
  2. 保存と最終保存

(2) に関する私の問題は、できるだけ早く開始しても、保存する時間が保証されないことです。

(1) に関する私の問題は... べぇ... ServiceLocator/IoC パターンを使用しているため (どのパターンが何であるかを思い出せなかった)、ICachedDataProviderたとえば のインターフェイスに同期操作を導入する必要があります。

他のアプローチはありますか?Async メソッドを同期メソッドに変換して、コードの再利用を増やすことはできますか?

4

3 に答える 3

2

Async メソッドを同期メソッドに変換して、コードの再利用を増やすことはできますか?

残念だけど違う。これらのメソッドをラップするために使用できるさまざまなアプローチがありますが、どれも確実ではありません。このブログ エントリでは、さまざまなアプローチについて説明します。あなたの場合、別のスレッドにオフロードすることをお勧めします。作業するのが最も簡単ですが、スレッドセーフである場合にのみ機能しICachedDataProviderます。

于 2013-08-03T15:56:02.867 に答える
1

機能しているように見えるものを見つけましたが、フィードバックや他の解決策を待つために、この質問をしばらく放置します.

Application_Closing と Application_Deactivated を次のように変更しました (この SO の質問に基づいて)

private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
     var dataSvc = SimpleIoc.Default.GetInstance<ICachedDataService>();
     var task = Task.Run(async () => { await dataSvc.StoreCachedDataAsync(); });
     task.Wait();
}
于 2013-08-03T15:59:29.527 に答える
0

そして引用ありがとう。お気づきのように、タスクをラップ/キックオフし、その完了を同期的に待機しようとするオプションがあります。

しかし...これはせいぜいその場しのぎです。クローズまたは非アクティブ化操作が開始されると、それを止めることはできず、開始された「デス クロック」を無効にすることはできません。限目。同じことが Windows ストア アプリの一時停止にも当てはまることに注意してください。「より多くの時間を買う」メカニズムはありません。Windows ストア アプリは「延期」を提供しますが、投稿で述べたように、それらは前述の「デッド クロック」の制約内で動作します。

あなたが言及したので、私はこれを持ち出します:

(2) に関する私の問題は、できるだけ早く開始しても、保存する時間が保証されないことです。

懸念事項を読んだところ、おそらくアプリが「保存」操作を開始し、保存の実行中にライフタイム イベント (閉じる/非アクティブ化) が発生するシナリオを示している可能性があります...これらのライフタイム イベントは進行中の保存を幸いなことに無視すると、アプリはその実行を放棄し、物事は単に無礼に停止します. このようなシナリオでは、保存操作に、操作が進行中であることを示す同期フラグを含めることができます。これは、ライフタイム イベント内で監視することができますが、(死んだ馬を打ち負かす危険を冒して) それでも、 「死の時計」全体に注意してください(さらに、物事は複雑/複雑になり始めています.)

最終的に、アプリが保存に許容時間よりも長くかかる可能性がある状況に陥った場合は、実際のメカニズムを再考し、そもそもその状況を回避する方法があるかどうかを確認することが重要になる場合があります。この有効期限内で非同期性を「いじる」方法はたくさんありますが、期限切れは発生します。

于 2013-08-04T02:06:20.010 に答える