在Xamarin.Forms

问题描述:

使用了Thread.Sleep我想执行以下在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; 
        })), 
      }, 
     } 
    } 
}; 

我包括System.ThreadingSystem.Threading.Tasks,但我仍然得到

名称“主题”不存在的当前上下文。

This site建议Thread.Sleep可用于Xamarin.Forms。我在一个共享的项目中,而不是PCL。

+1

'Thread.Sleep'应同时使用几乎所有的UI框架来避免(的WinForms/WPF/Xamarin.Forms/Silverlight的/ ... ),因为它会冻结UI线程并挂起UI。 –

+0

它仅用于演示目的,但谢谢您的补充。 – testing

如果你想等待

异步:await Task.Delay(10000);

同步:Task.Delay(10000).Wait();

但请尽量避免阻塞UI线程确保良好的用户体验并保持您的应用程序不变sponsive。

在Xamarin.Forms

使用了Thread.Sleep有两种Xamarin.Forms模板:

  • Xamarin.Forms便携式类库

    由于PCL子集机制,你没有机会得到Thread.Sleep

    更新2017: PCL现在已被弃用。如果使用.net标准2.0,则可以按照习惯使用Thread.Sleep

  • Xamarin.Forms共享项目

    这个模板中包含不支持Thread.Sleep不同的平台。 Windows UWP,Xamarin.Android和Xamarin.iOS不支持它,Windows Phone 8.1和Windows 8.1。如果卸载/删除2个项目,解决方案将生成。 (不要忘了使用的System.Threading;在App.cs)

+0

你是对的,UI线程不应该被阻止。这里仅用于演示目的。 – testing

+0

你知道为什么'Thread'没有被识别吗?在链接的页面上,它似乎能以某种方式起作用。 – testing

+1

因为Core库的PCL配置文件不同,我认为你没有'Thread.Sleep'。您在PCL中选择的支持的平台越多,可以使用的支持的类别/功能越少。 –

你可以尝试使用

await Task.Delay(milliseconds); 

,如果你想要把一个延迟你的线程。

阻止,你可以做

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

你可以这样做,但这与我想尝试的例子不同。该线程应该被第一个按钮不被延迟阻塞。你知道我错过了什么吗?子项目中的参考? – testing

+0

@testing: - 更新了我的答案以阻止它。请检查 –