2016-03-03 25 views
11

Chcę wykonać następująceKorzystanie Thread.Sleep w Xamarin.Forms

MainPage = new ContentPage 
{ 
    Content = new StackLayout 
    { 
     Children = 
     { 
      new Button 
      { 
       Text = "Thread.Sleep", 
       Command = new Command(() => 
       { 
        Thread.Sleep(1000); 
        MainPage.Animate("", x => MainPage.BackgroundColor = Color.FromRgb(x, x, x)); 
       }), 
      }, 
      new Button 
      { 
       Text = "Task.Run + Thread.Sleep", 
       Command = new Command(async() => 
       { 
        await Task.Run(() => Thread.Sleep(1000)); 
        MainPage.Animate("", x => MainPage.BackgroundColor = Color.FromRgb(x, x, x)); 
       }) 
      }, 
      new Button 
      { 
       Text = "Device.StartTimer", 
       Command = new Command(() => Device.StartTimer(
        TimeSpan.FromSeconds(1), 
        () => 
        { 
         MainPage.Animate("", x => MainPage.BackgroundColor = Color.FromRgb(x, x, x)); 
         return false; 
        })), 
      }, 
     } 
    } 
}; 

włączyłem System.Threading i System.Threading.Tasks, ale wciąż

Nazwa 'Temat' nie istnieje w obecny kontekst.

This site sugeruje, że Thread.Sleep może być stosowany w Xamarin.Forms. Mam to we wspólnym projekcie, a nie PCL.

+1

'Thread.Sleep' należy unikać podczas korzystania z niemal wszystkich ram UI (WinForms/WPF/Xamarin.Forms/Silverlight/...), ponieważ blokuje wątek interfejsu użytkownika i zawiesza interfejs użytkownika. –

+0

Jest to tylko do celów demonstracyjnych, ale dzięki za dodanie. – testing

Odpowiedz

23

Jeśli chcesz czekać

asynchronicznie: await Task.Delay(10000);

synchronicznie: Task.Delay(10000).Wait();

Ale spróbuj uniknąć blokowania wątku UI aby zapewnić wygodę użytkownikom i sprawić, by Twoja aplikacja ponownie działała sponsorujący.

Korzystanie Thread.Sleep w Xamarin.Forms

Istnieją dwa Xamarin.Forms szablony:

  • Xamarin.Forms Portable Class Library

    Ze względu na mechanizm podzbioru PCL, nie masz szansy uzyskać Thread.Sleep.

    Aktualizacja 2017: PCL są obecnie przestarzałe. Jeśli używasz .netstandard 2.0, możesz użyć Thread.Sleep, tak jak jesteś do tego przyzwyczajony.

  • Xamarin.Forms Shared Projekt

    Ten szablon zawiera różne platformy, które nie obsługują Thread.Sleep. Windows UWP, Xamarin.Android i Xamarin.iOS go obsługują, Windows Phone 8.1 i Windows 8.1 nie. Jeśli usuniesz/usuniesz 2 projekty, rozwiązanie zostanie zbudowane. (Nie zapomnij przy użyciu System.Threading; w App.cs)

+0

Masz rację, że wątek interfejsu użytkownika nie powinien zostać zablokowany. Tutaj jest tylko dla celów demonstracyjnych. – testing

+0

Czy masz pomysł, dlaczego "Thread" nie jest rozpoznawany? Na połączonej stronie wydaje się, że jakoś działa. – testing

+1

Myślę, że nie masz "Thread.Sleep" z powodu innego profilu PCL biblioteki Core. Im więcej obsługiwanych platform wybierzesz w PCL, tym mniej obsługiwanych klas/funkcji możesz użyć. –

3

Można spróbować użyć

await Task.Delay(milliseconds); 

jeśli chcesz umieścić opóźnienie w swoim wątku.

Do blokowania można zrobić

Task.Delay(TimeSpan.FromSeconds(5)).Wait(); 
+0

Można to zrobić, ale różni się to od przykładu, który chcę wypróbować. Wątek powinien zostać zablokowany, gdy pierwszy przycisk nie zostanie opóźniony. Czy masz pojęcie, czego mi brakuje? Odniesienie w podprojektach? – testing

+0

@ testowanie: - Zaktualizowano moją odpowiedź, aby ją zablokować.Proszę sprawdzić –