Programı çalıştırırken bir saniye bekleyin


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

Bu kodla grid hücrelerimi yazdırmadan önce bir saniye beklemek istiyorum ama çalışmıyor. Ne yapabilirim?


1
1 saniyelik beklemeden sonra hangi kodun çalıştırılması gerekiyor?
Allensb

1
Çalışmadığını nereden biliyorsun? 10000 uykuyu deneyin ve çalışıp çalışmadığına bakın. 1000 çalışıp çalışmadığını değerlendirmek için çok kısadır.
Missy

Bu düzgün çalışıyor: System.Threading.Thread.Sleep (1000);
Andrew

Yanıtlar:


183

Duraklıyor, ancak hücrede kırmızı renginizin görünmediğini mi görüyorsunuz? Bunu dene:

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

28

Şahsen ben Thread.Sleepkötü bir uygulama olduğunu düşünüyorum . Kullanıcı arayüzünü kilitler vb. Ben şahsen beklediği için zamanlayıcı uygulamalarını seviyorum.

Kullanım: 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();
}

16

Zamanlayıcı kullanarak işlevi bekleyin, UI kilitleri yok.

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();
    }
}

Kullanım: bunu beklemesi gereken kodunuzun içine yerleştirmeniz yeterlidir:

wait(1000); //wait one second

Sadece bir öneri. Min'i 60000 ile çarparsanız, parametre adı daha anlamlı olacaktır. timer1.Interval = dakika * 60000;
Golda

Evet, haklısınız, dakika yerine milisaniye olmalıdır. Adı güncelleyeceğim. Teşekkür
Said'in

3

Sanki burada yanlış olan tek şey sıraydı, Selçuklu uygulamanın ızgarayı doldurmadan önce bir saniye beklemesini istedi, bu yüzden Uyku komutunun doldur komutundan önce gelmesi gerekiyordu.

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

3

.Net Core DispatcherTimer,.

Zaman uyumsuz bir yöntem kullanmakta sorun olmazsa, Task.Delayihtiyaçlarımızı karşılayacaktır. Bu, hız sınırlayıcı nedenlerle bir for döngüsünün içinde beklemek istiyorsanız da yararlı olabilir.

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

Bu yöntemin tamamlanmasını aşağıdaki şekilde bekleyebilirsiniz:

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

Bu sadece mükemmel bir yol. Teşekkürler ! :)
Deniz

2

Meşgul bekleme, kısa ise ciddi bir dezavantaj olmayacaktır. Benim durumumda, bir kontrolü yanıp sönerek kullanıcıya görsel geri bildirim verme ihtiyacı vardı (bu, bazı milisaniyeler için arka planını değiştiren panoya kopyalanabilen bir grafik kontrolüdür). Bu şekilde iyi çalışıyor:

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;
....


1

Ana iş parçacığınızı dondurmadan beklemenin en iyi yolu Task.Delay işlevini kullanmaktır.

Yani kodunuz şöyle görünecek

var t = Task.Run(async delegate
{              
    dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
    dataGridView1.Refresh();
    await Task.Delay(1000);             
});

0

Bu işlevi deneyin

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

Çağrı işlevi

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

-4

Belki şu kodu deneyin:

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

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

5
Bu geçerli bir çözümdür. Ancak, meşgul bekleyen bir çözüm olduğu için CPU zamanını alacağını belirtmek gibi yararları ve zararları hakkında bir açıklama eklemelisiniz.

1
Daha kısa çözüm daha iyi çözüm
BASEER ULHASSAN
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.