Thread.Sleep pengganti di .NET untuk Windows Store

98

Thread.Sleep sepertinya tidak didukung di .NET untuk aplikasi Windows Store.

Misalnya, ini

System.Threading.Thread.Sleep(1000);

akan dikompilasi saat menargetkan .NET Framework (2.0, 3.5, 4.0, 4.5), tetapi tidak saat menargetkan .NET untuk aplikasi Windows Store (atau di pustaka kelas portabel yang menargetkan 4.5 dan penyimpanan).

System.Threading.Thread masih ada, hanya saja tidak ada metode Sleep.

Saya perlu menunda sesuatu selama beberapa detik di aplikasi saya, apakah ada pengganti yang cocok?

EDIT mengapa penundaan itu diperlukan: Aplikasi saya adalah sebuah permainan dan penundaan itu adalah untuk membuatnya tampak seperti komputer lawan sedang "memikirkan" tentang langkah selanjutnya. Metode ini sudah dipanggil secara asinkron (utas utama tidak diblokir), saya hanya ingin memperlambat waktu respons.

Max
sumber
2
Mempertimbangkan aplikasi Windows Store tidak seharusnya dapat membekukan UI (semuanya seharusnya asinkron), masuk akal jika itu tidak didukung.
Sruly
2
Apakah Anda memiliki Acara atau Monitorkelas? Anda dapat menggunakan Waitmetode dengan waktu tunggu untuk mensimulasikan tidur.
Tudor
apakah ini untuk Apptivate.ms? : 3
EaterOfCode
3
Yay karena membuang Thread.Sleepke tong sampah teknologi buruk.
pembelanjaan

Jawaban:

203

Aplikasi Windows Store menggunakan asynchrony - dan "asynchronous pause" disediakan oleh Task.Delay. Jadi dalam metode asinkron, Anda akan menulis:

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

... atau penundaan apa pun yang Anda inginkan. Metode asinkron akan berlanjut 30 detik kemudian, tetapi utas tidak akan diblokir, seperti untuk semua awaitekspresi.

Jon Skeet
sumber
1
Sayangnya, Task.Delay tampaknya tidak didukung saat menargetkan .NET 4.5 + store + WP7 di perpustakaan kelas portabel .. Saya kira saya akan memindahkan ini ke kelas khusus platform.
Max
1
@Max: Tidak, karena tidak ada sebelumnya .NET 4.5. IIRC, WP7 sendiri tidak memiliki dukungan TPL. (Saya bisa saja salah ...)
Jon Skeet
4
Anda bisa memakainya .RunSynchronously()jika perlu.
HappyNomad
1
@RAM: Nah Thread.Sleep ini didukung dalam NET 3.5, jadi pertanyaannya tidak berlaku. Tidak ada keraguan Anda memiliki sebuah pertanyaan, tetapi tidak terdengar seperti itu sama seperti yang satu ini. Silakan baca tinyurl.com/stack-hints kemudian ajukan pertanyaan baru.
Jon Skeet
2
@ RAM: Saya tidak yakin bagaimana saya seharusnya menebak itu dari komentar Anda. Ada banyak pertanyaan serupa di SO tentang WPF dan animasi.
Jon Skeet
46

Benci untuk menyatakan hal yang sudah jelas tetapi jika ada yang menginginkan satu baris System.Threading.Tasks.Task.Delay(3000).Wait()

Antony Thomas
sumber
20

Saya baru saja mengalami masalah yang sama dan menemukan solusi menarik lainnya yang ingin saya bagikan kepada Anda. Jika Anda benar-benar ingin memblokir utas, saya akan melakukannya seperti ini (terima kasih @Brannon untuk petunjuk "ramping"):

// `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));
}
Johannes Egger
sumber
Ini adalah jawaban terbaik untuk pengkodean portabel.
zezba9000
Gunakan versi "ramping" ini.
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!
}
Benny Neugebauer
sumber
-7

Hampir TIDAK ADA alasan (kecuali untuk tujuan pengujian) untuk PERNAH digunakan Thread.Sleep().

JIKA (dan hanya jika) Anda memiliki alasan yang sangat bagus untuk mengirim utas ke mode tidur, Anda mungkin ingin memeriksa Task.Delay(), yang dapat Anda tunggu untuk "menunggu" selama waktu tertentu. Meskipun bukan ide yang baik untuk memiliki utas yang duduk-duduk dan tidak melakukan apa pun. Praktik buruk ...

igrimpe
sumber
9
Saya tidak setuju. Jika utas adalah utas latar belakang dan tidurnya pendek, maka lebih efisien untuk membuatnya tidur selama beberapa milidetik daripada menggunakan pengatur waktu.
Jason Steele
1
dan kadang-kadang Anda disuruh melakukannya meskipun menasihati tokoh otoritas tersebut tentang konsekuensinya;)
Jordan