रनिंग प्रोग्राम में एक सेकंड रुकें


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

But इस कोड के साथ मेरी ग्रिड कोशिकाओं को प्रिंट करने से पहले एक सेकंड इंतजार करना चाहते हैं, लेकिन यह काम नहीं कर रहा है। मैं क्या कर सकता हूँ?


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है कि यह एक खराब कार्यान्वयन है। यह यूआई आदि को व्यक्तिगत रूप से लॉक करता है। मुझे व्यक्तिगत रूप से टाइमर कार्यान्वयन पसंद है क्योंकि यह इंतजार करता है।

उपयोग: 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 के साथ न्यूनतम गुणा करते हैं, तो पैरामीटर नाम अधिक सार्थक होगा। टाइमर1.इंटरवल = मिनट * 60000;
गोल्डा

हां, आप सही हैं कि यह मिनट की बजाय मिलीसेकंड होना चाहिए। मैं नाम अपडेट करूंगा। धन्यवाद
कहा

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

मुझे लगता है कि यह सब गलत था, यह आदेश था, सेल्कुकलू चाहता था कि ऐप ग्रिड में भरने से पहले एक सेकंड के लिए प्रतीक्षा करें, इसलिए स्लीप कमांड को भरने के आदेश से पहले आना चाहिए था।

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

2

.Net कोर याद आ रहा है DispatcherTimer

यदि हम एक async विधि का उपयोग करके ठीक हैं, Task.Delayतो हमारी आवश्यकताओं को पूरा करेगा। यह भी उपयोगी हो सकता है यदि आप दर-सीमित कारणों के लिए लूप के अंदर इंतजार करना चाहते हैं।

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

0

अपने मुख्य धागे को फ्रीज किए बिना इंतजार करने का सबसे अच्छा तरीका टास्कडेल फ़ंक्शन का उपयोग करना है।

तो आपका कोड इस तरह दिखेगा

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

-4

शायद इस कोड की कोशिश करें:

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

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

5
यह एक वैध समाधान है। हालाँकि, आपको इसके लाभों और हानियों का विवरण जोड़ना चाहिए, जैसे कि यह उल्लेख करना कि क्योंकि यह एक व्यस्त-प्रतीक्षा समाधान है, इसमें CPU समय लगेगा।

1
छोटा समाधान बेहतर समाधान है
आधारभूत इतिहास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.