আমি উপলব্ধ 5 টি বিকল্প দেখতে পাচ্ছি:
1. থ্রেড.জয়াইন
যেমনটি মিচের উত্তরের সাথে। তবে এটি আপনার ইউআই থ্রেডকে ব্লক করবে, তবে আপনি আপনার জন্য একটি টাইমআউট তৈরি করেছেন।
2. ব্যবহার ক WaitHandle
ManualResetEvent
যেমন একটি WaitHandle
জ্রিস্টা প্রস্তাবিত।
একটি বিষয় লক্ষণীয় হ'ল আপনি যদি একাধিক থ্রেডের জন্য অপেক্ষা করতে চান তবে WaitHandle.WaitAll()
এটি ডিফল্টরূপে কাজ করবে না, কারণ এটির জন্য এমটিএ থ্রেড প্রয়োজন। আপনি আপনার Main()
পদ্ধতিটি চিহ্নিত করে এটিকে ঘিরে ফেলতে পারেন MTAThread
- তবে এটি আপনার বার্তা পাম্পটিকে অবরুদ্ধ করে এবং আমি যা পড়েছি তা থেকে সুপারিশ করা হয় না।
3. একটি ইভেন্ট ফায়ার
ইভেন্ট এবং মাল্টি-থ্রেডিং সম্পর্কে জন স্কিটির এই পৃষ্ঠাটি দেখুন , এটি সম্ভবত যে কোনও ইভেন্ট if
এবং এর মধ্যে সদস্যতা ছাড়াই যেতে পারেEventName(this,EventArgs.Empty)
আমার - এটি আমার আগে ঘটেছিল।
(আশা করি এই সংকলন, আমি চেষ্টা করিনি)
public class Form1 : Form
{
int _count;
void ButtonClick(object sender, EventArgs e)
{
ThreadWorker worker = new ThreadWorker();
worker.ThreadDone += HandleThreadDone;
Thread thread1 = new Thread(worker.Run);
thread1.Start();
_count = 1;
}
void HandleThreadDone(object sender, EventArgs e)
{
// You should get the idea this is just an example
if (_count == 1)
{
ThreadWorker worker = new ThreadWorker();
worker.ThreadDone += HandleThreadDone;
Thread thread2 = new Thread(worker.Run);
thread2.Start();
_count++;
}
}
class ThreadWorker
{
public event EventHandler ThreadDone;
public void Run()
{
// Do a task
if (ThreadDone != null)
ThreadDone(this, EventArgs.Empty);
}
}
}
4. একটি প্রতিনিধি ব্যবহার করুন
public class Form1 : Form
{
int _count;
void ButtonClick(object sender, EventArgs e)
{
ThreadWorker worker = new ThreadWorker();
Thread thread1 = new Thread(worker.Run);
thread1.Start(HandleThreadDone);
_count = 1;
}
void HandleThreadDone()
{
// As before - just a simple example
if (_count == 1)
{
ThreadWorker worker = new ThreadWorker();
Thread thread2 = new Thread(worker.Run);
thread2.Start(HandleThreadDone);
_count++;
}
}
class ThreadWorker
{
// Switch to your favourite Action<T> or Func<T>
public void Run(object state)
{
// Do a task
Action completeAction = (Action)state;
completeAction.Invoke();
}
}
}
আপনি যদি _ অ্যাকাউন্ট পদ্ধতিটি ব্যবহার করেন তবে এটি ব্যবহার করে বাড়িয়ে নেওয়া কোনও ধারণা (নিরাপদ থাকতে) হতে পারে
Interlocked.Increment(ref _count)
আমি থ্রেড নোটিফিকেশনের জন্য প্রতিনিধি এবং ইভেন্টগুলির মধ্যে পার্থক্যটি জানতে আগ্রহী হব, ইভেন্টগুলির মধ্যে কেবলমাত্র পার্থক্যটিই আমি সিঙ্ক্রোনালি বলা হয়।
৫. পরিবর্তে এটি অবিচ্ছিন্নভাবে করুন
উত্তর এই প্রশ্ন এই পদ্ধতি সঙ্গে আপনার বিকল্প একটি খুব পরিষ্কার বিবরণ নেই।
প্রতিনিধি / ইভেন্টের ভুল থ্রেড
ইভেন্টগুলি করার / ইভেন্টের প্রতিনিধি হওয়ার অর্থ হ'ল আপনার ইভেন্ট হ্যান্ডলার পদ্ধতিটি মূল UI থ্রেড নয় থ্রেড 1 / থ্রেড 2 এ রয়েছে , সুতরাং আপনাকে হ্যান্ডলথ্রেডডোন পদ্ধতিগুলির শীর্ষে ফিরে যেতে হবে:
// Delegate example
if (InvokeRequired)
{
Invoke(new Action(HandleThreadDone));
return;
}