ঠিক আছে তাই আমি একটি স্থির async পদ্ধতি তৈরি করেছি। এটি অ্যাকশন আরম্ভ করে এমন নিয়ন্ত্রণ অক্ষম করে এবং অ্যাপ্লিকেশন কার্সরকে পরিবর্তন করে এটি কার্য হিসাবে অ্যাকশনটি চালায় এবং শেষ হওয়ার জন্য অপেক্ষা করে। কলারের অপেক্ষা করা অবস্থায় ফিরে আসা নিয়ন্ত্রণ করুন। তাই অ্যাপ্লিকেশনটি প্রতিক্রিয়াশীল থাকবে, এমনকি ব্যস্ত আইকনটি স্পিন করার পরেও।
async public static void LengthyOperation(Control control, Action action)
{
try
{
control.Enabled = false;
Application.UseWaitCursor = true;
Task doWork = new Task(() => action(), TaskCreationOptions.LongRunning);
Log.Info("Task Start");
doWork.Start();
Log.Info("Before Await");
await doWork;
Log.Info("After await");
}
finally
{
Log.Info("Finally");
Application.UseWaitCursor = false;
control.Enabled = true;
}
এখানে কোডটি মূল ফর্মটি দেয়
private void btnSleep_Click(object sender, EventArgs e)
{
var control = sender as Control;
if (control != null)
{
Log.Info("Launching lengthy operation...");
CursorWait.LengthyOperation(control, () => DummyAction());
Log.Info("...Lengthy operation launched.");
}
}
private void DummyAction()
{
try
{
var _log = NLog.LogManager.GetLogger("TmpLogger");
_log.Info("Action - Sleep");
TimeSpan sleep = new TimeSpan(0, 0, 16);
Thread.Sleep(sleep);
_log.Info("Action - Wakeup");
}
finally
{
}
}
ডামি অ্যাকশনের জন্য আমাকে একটি পৃথক লগার ব্যবহার করতে হয়েছিল (আমি এনলগ ব্যবহার করছি) এবং আমার প্রধান লগারটি ইউআইতে (একটি সমৃদ্ধ পাঠ্য বাক্স) লিখছেন। আমি কেবলমাত্র ফর্মের কোনও নির্দিষ্ট ধারককে কেন্দ্র করে ব্যস্ত কার্সর প্রদর্শন করতে সক্ষম হইনি (তবে আমি খুব কঠিন চেষ্টা করিনি)) সমস্ত নিয়ন্ত্রণের একটি UseWaitCursor সম্পত্তি রয়েছে তবে এটি নিয়ন্ত্রণগুলিতে কোনও প্রভাব ফেলবে বলে মনে হয় না seem আমি চেষ্টা করেছি (সম্ভবত তারা শীর্ষে ছিল না বলে?)
এখানে মূল লগ, যা জিনিসগুলি প্রত্যাশা অনুযায়ী ক্রম ঘটছে তা দেখায়:
16:51:33.1064 Launching lengthy operation...
16:51:33.1215 Task Start
16:51:33.1215 Before Await
16:51:33.1215 ...Lengthy operation launched.
16:51:49.1276 After await
16:51:49.1537 Finally