dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);
আমি এই কোডটি দিয়ে আমার গ্রিড সেলগুলি মুদ্রণের আগে এক সেকেন্ড অপেক্ষা করতে চাই, তবে এটি কাজ করছে না। আমি কি করতে পারি?
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);
আমি এই কোডটি দিয়ে আমার গ্রিড সেলগুলি মুদ্রণের আগে এক সেকেন্ড অপেক্ষা করতে চাই, তবে এটি কাজ করছে না। আমি কি করতে পারি?
উত্তর:
এটি কি বিরতি দিচ্ছে, কিন্তু আপনি আপনার লাল রঙটি ঘরে দেখছেন না? এটা চেষ্টা কর:
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
dataGridView1.Refresh();
System.Threading.Thread.Sleep(1000);
ব্যাক্তিগতভাবে আমি মনে করি 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();
}
টাইমার ব্যবহার করে অপেক্ষা করুন ফাংশন, কোনও ইউআই লক নেই।
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
আমার মনে হচ্ছে এখানে যা কিছু ভুল ছিল তা হ'ল অর্ডার, সেলুকুক্ল অ্যাপ্লিকেশনটি গ্রিড পূরণের আগে একটি সেকেন্ডের জন্য অপেক্ষা করা উচিত, তাই ফিল্ড কমান্ডের আগে স্লিপ কমান্ডটি আসা উচিত ছিল।
System.Threading.Thread.Sleep(1000);
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
নেট কোর মনে হচ্ছে না 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);
}
ব্যস্ত অপেক্ষায় সংক্ষিপ্ততা থাকলে তা তীব্র অসুবিধা হবে না। আমার ক্ষেত্রে কন্ট্রোলটি ফ্ল্যাশ করে ব্যবহারকারীকে ভিজ্যুয়াল প্রতিক্রিয়া দেওয়ার প্রয়োজন ছিল (এটি একটি চার্ট নিয়ন্ত্রণ যা ক্লিপবোর্ডে অনুলিপি করা যায় যা কিছু মিলি সেকেন্ডের জন্য এর ব্যাকগ্রাউন্ড পরিবর্তন করে)। এটি এইভাবে দুর্দান্ত কাজ করে:
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;
....
ব্যবহার dataGridView1.Refresh();
:)
আপনার মূল থ্রেডকে হিমায়িত না করে অপেক্ষা করার সর্বোত্তম উপায় হ'ল টাস্ক.ডেলা ফাংশনটি।
সুতরাং আপনার কোড এর মত দেখতে হবে
var t = Task.Run(async delegate
{
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
dataGridView1.Refresh();
await Task.Delay(1000);
});
এই ফাংশন চেষ্টা করুন
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
সম্ভবত এই কোড চেষ্টা করুন:
void wait (double x) {
DateTime t = DateTime.Now;
DateTime tf = DateTime.Now.AddSeconds(x);
while (t < tf) {
t = DateTime.Now;
}
}