web-dev-qa-db-ja.com

n秒待ってから、フォームをフリーズせずにコードの次の行

こんにちは、次のコード行に移動する前に数ミリ秒待機する方法を見つけようとしています。

Thread.Sleepを調べましたが、これによりメインフォームがフリーズします。これはアクティブのままにしておきたいです。

タイマーとストップウォッチを試してみましたが、どちらもメインのフォームがフリーズしたときにコンソールにポストする必要があるときにフリーズしました。

希望する待機時間でtask.delayまたはバックグラウンドワーカーを使用する方法が見つかりませんでした。

擬似コード:

Wait 2 - 6 seconds
Log "waiting"
Log "waiting"
Log "waiting"
Stop Waiting - Run next line of code.

私が試した方法は、フォームをフリーズしてからログを埋めるだけで、フォームをフリーズせず、次の行が実行されないことを意味する呼び出しイベントに対処することなく待機する簡単な方法が必要です。

私はまだc#に慣れていないので、どんな助けも素晴らしいでしょう。

17
Sam

awaitキーワードとTask.Delayはこれを簡単にします。

public async Task Foo()
{
    await Task.Delay(2000);
    txtConsole.AppendText("Waiting...");
    DoStuff();
}
27
Servy

DispatcherTimer を使用してみてください。 UIスレッドに委任するすべての作業を行う非常に便利なオブジェクトです。

例えば:

private DispatcherTimer _dtTimer = null;

public Constructor1(){
  _dtTimer = new DispatcherTimer();
  _dtTimer.Tick += new System.EventHandler(HandleTick);
  _dtTimer.Interval = new TimeSpan(0, 0, 0, 2); //Timespan of 2 seconds
  _dtTimer.Start();
}

private void HandleTick(object sender, System.EventArgs e) {
  _uiTextBlock.Text = "Timer ticked!";
}
3
Daniel

この場合、タイマーはThread.Sleepをハンドラーに入れるか、ハンドラー自体の完了に時間がかかりすぎない限り、正常に動作するはずです。

使用するUIフレームワークまたは.Netバージョンを指定していませんが、最新の.Netにはasync/awaitを使用できます。そうすれば、コードがバックグラウンドタスクを待っている間、UIがフリーズすることはありません。

void async MyMethod()
{  
    var result = await Task.Run(() => long_running_code);
}
0
alex