.NET for WindowsストアでのThread.Sleepの置き換え


98

Thread.Sleepは、Windowsストアアプリの.NETではサポートされていないようです。

たとえば、これ

System.Threading.Thread.Sleep(1000);

.NET Framework(2.0、3.5、4.0、4.5)を対象とする場合はコンパイルされますが、Windowsストアアプリ(または4.5とストアの両方を対象とするポータブルクラスライブラリ)の.NETを対象とする場合はコンパイルされません。

System.Threading.Threadはまだありますが、Sleepメソッドがありません。

アプリで何かを数秒遅らせる必要があります。適切な代替品はありますか?

遅延が必要な理由を編集する:私のアプリはゲームであり、遅延は、コンピューターの対戦相手が彼の次の動きについて「考えている」ように見せることです。メソッドはすでに非同期で呼び出されています(メインスレッドはブロックされていません)。応答時間を遅くしたいだけです。


2
WindowsストアアプリがUIをフリーズできないことになっている(すべてが非同期であると想定されている)ことを考えると、サポートされていないことは理にかなっています。
Sruly

2
イベントやMonitorクラスはありますか?Waitタイムアウトを指定してこのメソッドを使用すると、スリープをシミュレートできます。
チューダー

これはApptivate.msのですか?:3
EaterOfCode

3
Thread.Sleep悪い技術のゴミ箱に追放してくれてありがとう。
消費者2012

回答:


203

Windowsストアアプリは非同期を採用しており、「非同期の一時停止」がによって提供されTask.Delayます。したがって、非同期メソッド内では、次のように記述します。

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

...または、必要な遅延。非同期メソッドは30秒後に続行されますが、すべての式と同様に、スレッドはブロックされませんawait


1
残念ながら、ポータブルクラスライブラリで.NET 4.5 +ストア+ WP7を対象とする場合、Task.Delayはサポートされていないようです。これをプラットフォーム固有のクラスに移動する必要があると思います。
最大

1
@Max:いいえ。それは.NET 4.5以前には存在しなかったためです。IIRC、WP7自体はTPLをサポートしていません。(私は間違っている可能性があります...)
ジョン・スキート2012

4
.RunSynchronously()必要に応じて追加できます。
HappyNomad 2013年

1
@RAM:まあThread.Sleep れる質問は適用されませんので、.NET 3.5でサポートされています。質問があることは間違いありませんがこれと同じようには聞こえません。tinyurl.com/stack-hintsを読んでから、新しい質問をしてください。
Jon Skeet

2
@RAM:私はあなたのコメントからそれを推測するつもりだったのかわかりません。SOには、WPFとアニメーションに関して既に同様の質問がたくさんあります。
Jon Skeet


20

私は同じ問題を抱えていて、あなたと共有したい別の興味深い解決策を見つけました。本当にスレッドをブロックしたい場合は、次のようにします(@Brannonの「スリムな」ヒントに感謝します)。

// `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));
}

これは、ポータブルコーディングの最良の答えです。
zezba9000 2013年

これの「スリム」バージョンを使用してください。
ブラノン2017

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

使用する理由はほとんどありません(テスト目的を除く)Thread.Sleep()

スレッドをスリープ状態にする非常に適切な理由がある場合(かつその場合に限り)、を確認Task.Delay()することもできます。スレッドを座って何もしないのは良い考えではありませんが。悪い習慣...


9
同意しません。スレッドがバックグラウンドスレッドであり、スリープが短い場合は、タイマーを使用するよりも数ミリ秒間スリープさせる方が効率的です。
Jason Steele 2013年

1
そして時々あなたは結果のその権威図を助言しているにもかかわらずそれをするように言われる;)
ヨルダン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.