2017-08-06 28 views
7

Her dakika veritabanının arka plan kontrolünü başlatan ve çalıştıran bir uygulamam var. Bunun için kod aşağıdadır.Uygulamamda veya arka planda ne zaman durduğumda uygulamamda zamanlanmış bir işlemi doğru şekilde çalıştırabilirim?

Bellek sızıntısı olduğunu düşündüğüm şeyi alıyorum ve bu döngüdeki tüm alanlara bakıyorum.

Bu kodun bir döngü halinde kalması ve bellek sızıntısına neden olabileceği ya da onSleep ve onResume'nin zamanlayıcı döngüsünü doğru şekilde durdurmak ve başlatmak için% 100 emin bir şekilde kodlama yolu var mı?

Uygulamanın kullanılmasında ve ön planda, kodun zamanlanmış bölümünün yalnızca bir dakika çalışmasını istiyorum.

namespace Japanese 
{ 
    public partial class App : Application 
    { 

     private static Stopwatch stopWatch = new Stopwatch(); 

     public App() 
     { 
      InitializeComponent(); 
      MainPage = new Japanese.MainPage(); 
     } 

     protected override void OnStart() 
     { 
      App.DB.InitData(); 

      if (!stopWatch.IsRunning) 
       stopWatch.Start(); 

      Device.StartTimer(new TimeSpan(0, 0, 1),() => 
      { 
       if (stopWatch.IsRunning && stopWatch.Elapsed.Minutes >= defaultTimespan) 
       { 
        Debug.WriteLine("Checking database"); 
        PointChecker.CheckScore(); 
        stopWatch.Restart(); 
       } 
       return true; 
      }); 
     } 

     protected override void OnSleep() 
     { 
      stopWatch.Reset(); 
     } 

     protected override void OnResume() 
     { 
      stopWatch.Start(); 
     } 

    } 
} 
+0

Device.StartTimer tarafından başlattığınız bir zamanlayıcıyı durdurmanız gerekir. Neden kronometreyi kullanıyorsunuz? –

+1

Zamanlama ve kronometreyi kullanarak tasarım yapma konusunda net olmamasına rağmen, PointChecker.CheckScore'un yanı sıra bellek sızıntısına neden olabilecek hiçbir şey göremiyorum. Bunu bir saatliğine koştum ve –

+1

'u çalıştırmaya devam ettim. Uygulamayı iOS'ta kapattığınızda artık çalışmaz. Uygulaman için uygun mu? Arka plan görevleri hakkında bu [forum gönderisini] (https://forums.xamarin.com/discussion/11939/run-background-task-every-x-amount-of-time) okumalısınız. – Harry

cevap

3

Uygulama sınıfı çapraz platform mobil uygulama temsil sınıf, hatta senin "MainPage" çalışmadığı oldu, bu yüzden ben size ana sayfasında OnAppearing ve OnDisappearing yöntemleri kullanmak gerektiğini düşünüyorum (a :ContentPage).

Belki böyle bir şey:

protected override void OnAppearing() 
{ 
    stopWatch.Start(); 
    base.OnAppearing(); 
} 

ve

protected override void OnDisappearing() 
{ 
stopWatch.Reset(); 
base.OnDisappearing(); 
} 

O, Mabrouk yardımcı olur.

İlgili konular