চলমান প্রোগ্রামে এক সেকেন্ড অপেক্ষা করুন


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

আমি এই কোডটি দিয়ে আমার গ্রিড সেলগুলি মুদ্রণের আগে এক সেকেন্ড অপেক্ষা করতে চাই, তবে এটি কাজ করছে না। আমি কি করতে পারি?


4
1 সেকেন্ডের অপেক্ষার পরে কোন কোডটি চালানো হবে?
অ্যালেনসব

4
আপনি কীভাবে জানেন যে এটি কাজ করছে না? 10000 ঘুমানোর চেষ্টা করুন এবং দেখুন এটি কাজ করছে কিনা। এটি কাজ করছে কিনা তা মূল্যায়নের জন্য 1000 খুব সংক্ষিপ্ত।
মিস 17

এটি সূক্ষ্মভাবে কাজ করে: System.Threading.Thread.S خوب (1000);
অ্যান্ড্রু

উত্তর:


184

এটি কি বিরতি দিচ্ছে, কিন্তু আপনি আপনার লাল রঙটি ঘরে দেখছেন না? এটা চেষ্টা কর:

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

29

ব্যাক্তিগতভাবে আমি মনে করি 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();
}

16

টাইমার ব্যবহার করে অপেক্ষা করুন ফাংশন, কোনও ইউআই লক নেই।

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;
গোল্ডা

হ্যাঁ, আপনি ঠিক বলেছেন এটি মিনিটের পরিবর্তে মিলিসেকেন্ড হওয়া উচিত। নামটি আপডেট করব। ধন্যবাদ
সাঈদ

3

আমার মনে হচ্ছে এখানে যা কিছু ভুল ছিল তা হ'ল অর্ডার, সেলুকুক্ল অ্যাপ্লিকেশনটি গ্রিড পূরণের আগে একটি সেকেন্ডের জন্য অপেক্ষা করা উচিত, তাই ফিল্ড কমান্ডের আগে স্লিপ কমান্ডটি আসা উচিত ছিল।

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

3

নেট কোর মনে হচ্ছে না DispatcherTimer

যদি আমরা একটি অ্যাসিঙ্ক পদ্ধতি ব্যবহার করে ঠিক থাকি তবে 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);
}

ঠিক নিখুঁত উপায়। ধন্যবাদ! :)
ডেনিজ

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


1

আপনার মূল থ্রেডকে হিমায়িত না করে অপেক্ষা করার সর্বোত্তম উপায় হ'ল টাস্ক.ডেলা ফাংশনটি।

সুতরাং আপনার কোড এর মত দেখতে হবে

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

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
এটি একটি বৈধ সমাধান। তবে, আপনার এর সুবিধাগুলি এবং ক্ষতির একটি বিবরণ যুক্ত করা উচিত, যেমন উল্লেখ করা যেহেতু এটি একটি ব্যস্ত-অপেক্ষার সমাধান, এটি সিপিইউ সময় গ্রহণ করবে।

4
সংক্ষিপ্ত সমাধানটি আরও ভাল সমাধান
বেসার উলহসান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.