33

私はプログラミングに関して信じられないほどの初心者であり、これまで十分に学習してきたと思いますが、思い通りに遅延させるというアイデアをまだ理解できていません。私が取り組んでいるのは、戦闘システムを含む Windows フォーム アプリケーションを使用した一種のテスト "ゲーム" です。その中で、数秒ごとにアクションを行う NPC を作成したいと考えています。問題は、プレイヤーが攻撃の間に対話できるようにしたいということです。Thread.sleep は、マルチスレッドの方法がわからないだけでなく、実行しようとするたびに、次のように言うと、実際には機能しないようです。

 textBox1.Text += "\r\nThread Sleeps!";
 System.Threading.Thread.Sleep(4000);
 textBox1.Text += "\r\nThread awakens!";

最初にスリープしてから、両方の行を印刷することを主張しているようです。

現時点で言えることはそれだけだと思いますが、それでも漠然としていたり​​、言葉が多すぎたりする場合は、遠慮なく教えてください。

要するに、C# では、実行する前に何かを遅らせたいのですが、同時にユーザーの操作を許可します。

4

5 に答える 5

66

.NET 4.5 を使用している場合は、新しい async/await フレームワークを使用して、スレッドをロックせずにスリープできます。

どのように機能するかは、非同期操作が必要な関数をasyncキーワードでマークすることです。これは、コンパイラへの単なるヒントです。次にawait、コードを非同期で実行する行でキーワードを使用すると、プログラムはスレッドまたは UI をロックせずに待機します。(await 行で) 呼び出すメソッドもasyncキーワードでマークする必要があり、通常はImportFilesAsyncのように Async で終わる名前が付けられます。

あなたの例で行う必要があるのは次のとおりです。

  1. プログラムにターゲット フレームワークとして.Net Framework 4.5があることを確認します。
  2. スリープする必要がある関数をキーワードでマークしますasync(以下の例を参照)。
  3. コードに追加using System.Threading.Tasks;します。

Task.Delayこれで、メソッドの代わりにメソッドを使用する準備ができました(定義でがマークされているため、onSystem.Threading.Thread.Sleepを使用できます)。awaitTask.DelayTask.Delayasync

private async void button1_Click(object sender, EventArgs e)
{
    textBox1.Text += "\r\nThread Sleeps!";
    await Task.Delay(3000);
    textBox1.Text += "\r\nThread awakens!";
}

Task.DelayAwaitの詳細については、こちらを参照してください。

于 2013-08-22T07:39:25.777 に答える
1

おそらくタイマーを使用できます:http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx

タイマーは、最大 1 ミリ秒の精度を提供できます。ティック間隔に応じて、イベントが生成されます。tick イベント内で作業を行います。

于 2013-08-22T05:50:15.513 に答える
-2
private void WaitNSeconds(int seconds)
{
    if (seconds < 1) return;
    DateTime _desired = DateTime.Now.AddSeconds(seconds);
    while (DateTime.Now < _desired) {
         Thread.Sleep(1);
         System.Windows.Forms.Application.DoEvents();
    }
}
于 2017-07-19T11:28:56.827 に答える