Mevcut 5 seçeneği görebiliyorum:
1. Konu.Katıl
Mitch'in cevabı gibi. Ancak bu UI iş parçacığınızı engelleyecektir, ancak sizin için yerleşik bir Zaman Aşımı alırsınız.
2. Bir WaitHandle
ManualResetEvent
bir WaitHandle
jrista önerdiği gibi.
Dikkat edilmesi gereken bir şey WaitHandle.WaitAll()
, bir MTA iş parçacığı gerektirdiğinden, birden fazla iş parçacığını beklemek istiyorsanız, varsayılan olarak çalışmaz. Main()
Yönteminizi işaretleyerek bu sorunu çözebilirsiniz MTAThread
- ancak bu mesaj pompanızı engeller ve okuduğumdan önerilmez.
3. Bir olayı başlat
Jon Skeet tarafından etkinlikler ve çoklu iş parçacığı hakkındaki bu sayfaya bakın , bir etkinliğin if
veEventName(this,EventArgs.Empty)
- .
(Umarım bunlar derlenir, denemedim)
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. Bir temsilci kullanın
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();
}
}
}
_Count yöntemini kullanırsanız, kullanarak güvenli hale getirmek bir fikir olabilir (güvenli olmak için)
Interlocked.Increment(ref _count)
Ben iş parçacığı bildirimi için delege ve olayları kullanma arasındaki farkı bilmek istiyorum, biliyorum tek fark olaylar senkronize olarak adlandırılır.
5. Bunun yerine eşzamansız olarak yapın
Cevabı bu soruya bu yöntem ile seçeneklerin çok net bir açıklaması vardır.
Yanlış iş parçacığında Temsilci / Etkinlikler
Bir şeyler yapmanın olay / temsilci yolu, olay işleyici yönteminizin ana kullanıcı arabirimi iş parçacığında değil, iş parçacığı1 / iş parçacığı2'de olduğu anlamına gelir;
// Delegate example
if (InvokeRequired)
{
Invoke(new Action(HandleThreadDone));
return;
}