web-dev-qa-db-ja.com

Windowsストア用.NETのThread.Sleep置換

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

たとえば、これ

System.Threading.Thread.Sleep(1000);

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

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

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

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

97
Max

Windowsストアアプリは非同期性を取り入れており、「非同期ポーズ」は Task.Delay によって提供されます。したがって、非同期メソッド内で次のように記述します。

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

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

202
Jon Skeet

明白なことを述べるのは嫌いですが、だれかが1行System.Threading.Tasks.Task.Delay(3000).Wait()を望んだ場合

46
Antony Thomas

私はちょうど同じ問題を抱えていて、あなたと共有したい別の興味深い解決策を見つけました。スレッドを本当にブロックしたい場合は、次のようにします(「スリムな」ヒントについて@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));
}
19
Johannes Egger

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!
}
11