2016-03-03 44 views
11

voglio eseguire il seguenteUtilizzando Thread.Sleep in 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; 
        })), 
      }, 
     } 
    } 
}; 

ho incluso System.Threading e System.Threading.Tasks, ma ho ancora ottenere

Il nome 'Discussione' non esiste nel contesto attuale.

This site suggerisce che Thread.Sleep può essere utilizzato in Xamarin.Forms. Ho questo in un progetto condiviso, non in un PCL.

+1

'Thread.Sleep' dovrebbero essere evitati durante l'utilizzo di quasi tutti i framework di interfaccia utente (WinForms/WPF/Xamarin.Forms/Silverlight/...) poiché congela il thread dell'interfaccia utente e blocca l'interfaccia utente. –

+0

È solo a scopo dimostrativo, ma grazie per l'aggiunta. – testing

risposta

23

Se si desidera attendere

in modo asincrono: await Task.Delay(10000);

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

Ma per favore cercate di evitare di bloccare il thread UI per garantire una buona esperienza utente e mantenere la tua app re sponsive.

Utilizzando Thread.Sleep in Xamarin.Forms

ci sono due modelli: Xamarin.Forms

  • Xamarin.Forms Classe portatile Biblioteca

    A causa del meccanismo di PCL sottoinsieme, non hai alcuna possibilità di ottenere Thread.Sleep.

    Aggiornamento 2017: I PCL sono deprecati, ora. Se usi .netstandard 2.0, puoi usare Thread.Sleep come sei abituato.

  • Xamarin.Forms Progetto condiviso

    Questo modello contiene diverse piattaforme che non supportano Thread.Sleep. Windows UWP, Xamarin.Android e Xamarin.iOS lo supportano, Windows Phone 8.1 e Windows 8.1 no. Se si scaricano/eliminano i 2 progetti, la soluzione viene creata. (Non dimenticate utilizzando System.Threading; nel vostro App.cs)

+0

Hai ragione che il thread dell'interfaccia utente non dovrebbe essere bloccato. Qui è solo a scopo dimostrativo. – testing

+0

Hai un'idea del perché 'Thread' non è riconosciuto? Sulla pagina collegata sembra che in qualche modo funzioni. – testing

+1

Penso che tu non abbia 'Thread.Sleep' a causa di un diverso profilo PCL della tua libreria Core. Le piattaforme più supportate selezionate in PCL, le classi/le funzioni meno supportate che è possibile utilizzare. –

3

Si può provare a utilizzare

await Task.Delay(milliseconds); 

se si vuole mettere un ritardo nel tuo thread.

per il blocco si può fare

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

Si potrebbe fare ciò, ma questo è diverso dall'esempio che voglio provare. Il thread dovrebbe essere bloccato con il primo pulsante non ritardato. Hai un'idea di ciò che mi manca? Un riferimento nei sottoprogetti? – testing

+0

@testing: - Aggiornato la mia risposta per bloccarlo.Si prega di verificare –