Cum să așteptați finalizarea firului înainte de a continua?

Am un cod pentru pornirea unui fir pe .NET CF 2.0:

ThreadStart tStart = new ThreadStart(MyMethod);
Thread t = new Thread(tStart);
t.Start();

Dacă numesc acest lucru în interiorul unei bucla, elementele sunt complet necorespunzătoare. Cum introduceți o așteptare după t.Start() , astfel încât lucrările asupra firului să se finalizeze înainte ca codul să continue? Va fi BeginInvoke / EndInvoke o opțiune mai bună pentru acest lucru decât crearea manuală a firelor?

0
fr hi bn

3 răspunsuri

Dacă citesc acest lucru în mod corespunzător, porniți articole de lucru pe o mulțime de fire, dar sunteți preocupat de faptul că firele se termină din ordine și preferați să așteptați până când fiecare fir va fi terminat în ordinea în care au fost pornite?

Dacă acesta este cazul, atunci nu sunt sigur de ce creați un fir pe fiecare element de lucru. Poate că te-ai putea extinde?

Dacă a trebuit să așteptați un fir pentru a finaliza o puteți face:

t.Join();
0
adăugat

Un alt mod de așteptare pentru finalizarea unui fir este utilizarea unui AutoResetEvent .

private readonly AutoResetEvent mWaitForThread = new AutoResetEvent(false);

private void Blah()
{
    ThreadStart tStart = new ThreadStart(MyMethod);
    Thread t = new Thread(tStart);
    t.Start();

    //... (any other things)
    mWaitForThread.WaitOne();
}

private void MyMethod()
{
     //... (execute any other action)
     mWaitForThread.Set();
}
0
adăugat

Cât de mult aveți nevoie să impuneți asupra firelor? Dacă aveți nevoie doar de toate lucrările începute în bucla pentru a termina înainte de a continua codul, dar nu vă interesează ordinea în care lucrarea din cadrul bucla se încheie, atunci apelarea Join este răspunsul. Pentru a adăuga mai multe detalii la răspunsul lui Kevin Kenny, ar trebui să apelați Alăturați-vă în afara buclă. Aceasta înseamnă că veți avea nevoie de o colecție pentru a menține referințe la firele pe care le-ați început:

// Start all of the threads.
List<thread> startedThreads = new List<thread>();
foreach (...) {
  Thread thread = new Thread(new ThreadStart(MyMethod));
  thread.Start();
  startedThreads.Add(thread);
}

// Wait for all of the threads to finish.
foreach (Thread thread in startedThreads) {
  thread.Join();
}

În schimb, dacă ați apelat la Alăturați-vă în interiorul bucla, rezultatul ar fi în principiu același ca și cum nu ați folosi firele deloc. Fiecare iterație a corpului de buclă ar crea și începe un fir, dar apoi imediat se alăture și așteptați să termine.

Dacă firele individuale produc un rezultat (scrieți un mesaj într-un jurnal, de exemplu), atunci mesajele pot părea incomode, deoarece nu există o coordonare între fire. Este posibil ca firele să obțină rezultatele în ordine, coordonându-le cu un monitor.

0
adăugat