Nasıl parçacığı ile bitirmek için bekleyin .NET?
İki iş parçacığı için gereken hiç bir iş parçacığı daha önce C kullandım ben# gibi ana UI iş parçacığı. Temelde şu var.
public void StartTheActions()
{
//Starting thread 1....
Thread t1 = new Thread(new ThreadStart(action1));
t1.Start();
// Now, I want for the main thread (which is calling `StartTheActions` method)
// to wait for `t1` to finish. I've created an event in `action1` for this.
// The I wish `t2` to start...
Thread t2 = new Thread(new ThreadStart(action2));
t2.Start();
}
Yani, aslında, benim sorum bitirmek için başka bir iş parçacığı bir bekleyiş var. Bunu yapmak için en iyi yolu nedir?
CEVAP
5 seçenekleri görebilirsiniz:
1. İplik.Katılın
Mitch'in cevap olarak. Ama bu bir zaman Aşımı için yerleşik olarak bulunur, ancak UI iş parçacığı engeller.
2. WaitHandle
kullanın
ManualResetEvent
WaitHandle
bir jrista önerdi.
Unutulmaması gereken bir şey varsa, birden çok iş parçacığı bir MTA iş parçacığı ihtiyacı olarak varsayılan olarak işe yaramaz bekleyin isterseniz. MTAThread
- ancak bu bloklar Mesajınızı pompa ile Main()
işaretleme yöntemi ile bu sorunun üstesinden gelmek ve okuduğum kadarıyla tavsiye edilmez.
3. Bir olayı harekete
this page by Jon Skeet ilgili olaylar ve çoklu bakın, olay if
EventName(this,EventArgs.Empty)
- bana daha önce de oldu bu arasında unsuscribed hale gelebilir.
(Bu derleme umarım, 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
public class Form1 : Form
{
int _count;
void ButtonClick(object sender, EventArgs e)
{
ThreadWorker worker = new ThreadWorker(HandleThreadDone);
Thread thread1 = new Thread(worker.Run);
thread1.Start();
_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();
}
}
}
Eğer _count yöntemi kullanırsanız, bir fikir olabilir (güvenli) kullanarak artırmak
Interlocked.Increment(ref _count)
İş parçacığı bildirim için kullanan delegeler ve olaylar arasındaki farkı bilmek isterim, bildiğim tek fark eşzamanlı olarak adlandırılan olaylar vardır.
5. Zaman uyumsuz olarak yerine yap
this question cevabını bu yöntem ile seçenekleri çok net bir açıklaması vardır.
Yanlış konuyu Olayları temsilci
İşleri olay/temsilci şekilde olay işleyicisi anlamına gelecektiryöntemüzerinde thread1/thread2ana kullanıcı arabirimi iş parçacığı değilçok doğru HandleThreadDone yöntemleri üst: geri geçiş yapmak gerekir
// Delegate example
if (InvokeRequired)
{
Invoke(new Action(HandleThreadDone));
return;
}
Nasıl birçok alt işlemler ve çıkış kod...
Nasıl jQuery bir Ajax çağrısı için bek...
Nasıl ilerleme iletişim ve arka plan i...
Nasıl / Duraklat Android parçacığı vey...
Java nasıl bir iş Parçacığı için bir p...