Windows Mağazası için .NET'te Thread.Sleep değişimi


98

Thread.Sleep , Windows Mağazası uygulamaları için .NET'te desteklenmiyor gibi görünüyor.

Örneğin, bu

System.Threading.Thread.Sleep(1000);

herhangi bir .NET Framework (2.0, 3.5, 4.0, 4.5) hedeflenirken derlenir, ancak Windows Mağazası uygulamaları için .NET hedeflenirken (veya hem 4.5 hem de mağazayı hedefleyen taşınabilir bir sınıf kitaplığında) derlenmez.

System.Threading.Thread hala orada, sadece Uyku yöntemine sahip değil.

Uygulamamda bir şeyi birkaç saniye ertelemem gerekiyor, uygun bir yedek var mı?

Gecikmenin neden gerekli olduğunu DÜZENLEYİN: Uygulamam bir oyun ve gecikme, bilgisayar rakibinin bir sonraki hamlesini "düşünüyor" gibi görünmesini sağlamak. Yöntem zaten eşzamansız olarak çağrıldı (ana iş parçacığı engellenmedi), sadece yanıt süresini yavaşlatmak istiyorum.


2
Windows Mağazası uygulamalarının kullanıcı arayüzünü donduramayacağı düşünüldüğünde (her şeyin eşzamansız olması gerekir), desteklenmediği mantıklıdır.
Sruly

2
Etkinlikleriniz veya Monitorsınıfınız var mı? WaitYöntemi, uykuyu simüle etmek için bir zaman aşımı ile kullanabilirsiniz .
Tudor

bu Apptivate.ms için mi? : 3
EaterOfCode

3
Thread.SleepKötü teknolojinin çöp kovasına sürgün ettiğiniz için yaşayın .
harcayan

Yanıtlar:


203

Windows Mağazası uygulamaları eşzamansızlığı benimser ve "eşzamansız duraklama" tarafından sağlanır Task.Delay. Eşzamansız bir yöntemde şunu yazarsınız:

await Task.Delay(TimeSpan.FromSeconds(30));

... ya da ne kadar geciktirseniz isteyin. Asenkron metot 30 saniye sonra devam edecek, ancak iplik olacak değil sadece tüm gelince engellenecek awaitifadeler.


1
Maalesef Task.Delay, taşınabilir bir sınıf kitaplığında .NET 4.5 + mağaza + WP7'yi hedeflerken desteklenmiyor gibi görünüyor .. Sanırım bunu platforma özel sınıflara taşıyacağım.
Fazla

1
@Max: Hayır, çünkü .NET 4.5'ten önce mevcut değildi. IIRC, WP7'nin kendisi herhangi bir TPL desteğine sahip değildir. (Yanılıyor olabilirim ...)
Jon Skeet

4
.RunSynchronously()Gerekirse üstesinden gelebilirsiniz .
HappyNomad

1
@RAM: Eh Thread.Sleep olan soru geçerli değildir, yani .NET 3.5 desteklenen. Şüphesiz bir sorunuz var, ama kulağa bununla aynı gibi gelmiyor. Lütfen tinyurl.com/stack-hints adresini okuyun ve ardından yeni bir soru sorun.
Jon Skeet

2
@RAM: Yorumlarınızdan bunu nasıl tahmin etmem gerektiğini bilmiyorum. SO'da WPF ve animasyon hakkında zaten birçok benzer soru var.
Jon Skeet

46

Apaçık olanı söylemekten nefret ediyorum ama biri tek bir satır isterse System.Threading.Tasks.Task.Delay(3000).Wait()


20

Ben de aynı sorunu yaşadım ve sizinle paylaşmak istediğim başka ilginç bir çözüm buldum. İleti dizisini gerçekten engellemek istiyorsanız, bunu şöyle yapardım ("ince" ipucu için @ Brannon'a teşekkürler):

// `waitHandle.Set` is never called, so we wait always until the timeout occurs
using (var waitHandle = new ManualResetEventSlim(initialState: false))
{
    waitHandle.Wait(TimeSpan.FromSeconds(5));
}

Taşınabilir kodlama için en iyi cevap budur.
zezba9000

Bunun "ince" versiyonunu kullanın.
Brannon

11

MainPage.xaml.cs

public MainPage()
{
  this.InitializeComponent();
  this.WaitForFiveSeconds();
}

private async void WaitForFiveSeconds()
{
  await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(5));
  // do something after 5 seconds!
}

-7

HİÇ kullanımı için (test amaçlı olanlar dışında) neredeyse HİÇBİR sebep yoktur Thread.Sleep().

EĞER (ve sadece) uykuya bir iş parçacığı göndermek için çok iyi bir nedeniniz varsa, kontrol etmek isteyebilirsiniz, bunu Task.Delay()belirli bir süre "beklemek" için bekleyebilirsiniz. Yine de etrafta bir ipliğin oturup hiçbir şey yapmaması asla iyi bir fikir değildir. Kötü uygulama ...


9
Katılmıyorum. İş parçacığı bir arka plan iş parçacığı ise ve uyku kısaysa, zamanlayıcı kullanmaktan birkaç milisaniye uyumasını sağlamak daha etkilidir.
Jason Steele

1
ve bazen sonuçlarla ilgili otorite figürünü tavsiye etmenize rağmen bunu yapmanız söylenir;)
Ürdün
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.