プログラムの実行中に1秒待ちます


104
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);

thisこのコードでグリッドセルを印刷する前に1秒待機したいのですが、機能しません。私に何ができる?


1
1秒待機後に実行されるコードは何ですか?
Allensb

1
それが機能していないことをどのようにしてわかりますか?10000睡眠を試して、それが機能しているかどうかを確認します。1000は、機能しているかどうかを評価するには非常に短いです。
ミッシー

これは正常に動作します:System.Threading.Thread.Sleep(1000);
アンドリュー

回答:


177

一時停止していますが、セルに赤い色が表示されていませんか?これを試して:

dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
dataGridView1.Refresh();
System.Threading.Thread.Sleep(1000);

28

個人的にThread.Sleepは貧弱な実装だと思います。それはUIなどをロックします。私はそれが待機してから起動するので、私は個人的にはタイマー実装が好きです。

使用法: DelayFactory.DelayAction(500, new Action(() => { this.RunAction(); }));

//Note Forms.Timer and Timer() have similar implementations. 

public static void DelayAction(int millisecond, Action action)
{
    var timer = new DispatcherTimer();
    timer.Tick += delegate

    {
        action.Invoke();
        timer.Stop();
    };

    timer.Interval = TimeSpan.FromMilliseconds(millisecond);
    timer.Start();
}

15

タイマーを使用した待機機能、UIロックなし。

public void wait(int milliseconds)
{
    var timer1 = new System.Windows.Forms.Timer();
    if (milliseconds == 0 || milliseconds < 0) return;

    // Console.WriteLine("start wait timer");
    timer1.Interval = milliseconds;
    timer1.Enabled  = true;
    timer1.Start();

    timer1.Tick += (s, e) =>
    {
        timer1.Enabled = false;
        timer1.Stop();
        // Console.WriteLine("stop wait timer");
    };

    while (timer1.Enabled)
    {
        Application.DoEvents();
    }
}

使用法:待機する必要があるコード内にこれを配置するだけです。

wait(1000); //wait one second

ただの提案です。最小値に60000を掛けると、パラメーター名がよりわかりやすくなります。timer1.Interval = min * 60000;
Golda、

はい、正解です。分ではなくミリ秒にする必要があります。名前を更新します。おかげで
サイード

2

それが短い場合、忙しい待機は深刻な欠点ではありません。私の場合、コントロールをフラッシュすることでユーザーに視覚的なフィードバックを提供する必要がありました(これはクリップボードにコピーできるグラフコントロールであり、数ミリ秒の間、背景を変更します)。それはこのようにうまく機能します:

using System.Threading;
...
Clipboard.SetImage(bm);   // some code
distribution_chart.BackColor = Color.Gray;
Application.DoEvents();   // ensure repaint, may be not needed
Thread.Sleep(50);
distribution_chart.BackColor = Color.OldLace;
....

2

ここで問題だったのは順序だけだったように思います。セルチュクルはアプリがグリッドを埋める前に1秒間待機することを望んでいたため、Sleepコマンドがfillコマンドの前にあるはずです。

    System.Threading.Thread.Sleep(1000);
    dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;

2

.Net Coreに欠落しているようDispatcherTimerです。

非同期メソッドを使用することに問題がなければTask.Delay、ニーズを満たします。これは、レート制限の理由でforループ内で待機する場合にも役立ちます。

public async Task DoTasks(List<Items> items)
{
    foreach (var item in items)
    {
        await Task.Delay(2 * 1000);
        DoWork(item);
    }
}

次のように、このメソッドの完了を待つことができます。

public async void TaskCaller(List<Item> items)
{
    await DoTasks(items);
}

それは完璧な方法です。よろしくお願いします!:)
デニズ


0

この機能をお試しください

public void Wait(int time) 
{           
    Thread thread = new Thread(delegate()
    {   
        System.Threading.Thread.Sleep(time);
    });
    thread.Start();
    while (thread.IsAlive)
    Application.DoEvents();
}

関数を呼び出す

Wait(1000); // Wait for 1000ms = 1s

-4

多分このコードを試してください:

void wait (double x) {
    DateTime t = DateTime.Now;
    DateTime tf = DateTime.Now.AddSeconds(x);

    while (t < tf) {
        t = DateTime.Now;
    }
}

5
これは有効なソリューションです。ただし、その利点と害の説明を追加する必要があります。たとえば、これはビジー待機ソリューションであるため、CPU時間を消費することを説明します。

1
短い方が良いソリューションです
BASEER ULHASSAN 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.