Bagaimana untuk menunggu thread lengkap sebelum melanjutkan?

Saya memiliki beberapa kode untuk memulai sebuah thread di .NET CF 2.0:

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

Jika saya menyebut ini dalam lingkaran barang-barang yang benar-benar keluar dari urutan. Bagaimana memperkenalkan menunggu setelah t.Start(), sehingga pekerjaan di thread selesai sebelum kode berlanjut? Akan BeginInvoke/EndInvoke menjadi pilihan yang lebih baik untuk ini daripada manual membuat thread?

Larutan

Berapa banyak urutan yang anda butuhkan untuk memaksakan pada benang? Jika anda hanya membutuhkan semua pekerjaan dimulai pada loop untuk menyelesaikan sebelum kode terus, tapi anda don't peduli tentang urutan pekerjaan dalam loop selesai, kemudian memanggil Bergabung adalah jawabannya. Untuk menambahkan lebih detail untuk Kevin Kenny's jawaban, anda harus memanggil Bergabung luar loop. Ini berarti anda akan membutuhkan koleksi untuk memegang referensi ke thread yang anda mulai:

// Start all of the threads.
List startedThreads = new List();
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();
}

Sebaliknya, jika anda bernama Bergabung dalam lingkaran, hasilnya akan pada dasarnya sama seperti tidak menggunakan benang sama sekali. Setiap iterasi dari loop tubuh akan membuat dan memulai thread tapi kemudian segera Bergabung dan tunggu sampai selesai.

Jika individu benang menghasilkan beberapa hasil (menulis pesan di log, misalnya) maka pesan yang mungkin masih muncul out of order karena ada's tidak ada koordinasi antara benang. Hal ini dimungkinkan untuk mendapatkan benang untuk output hasil mereka dalam rangka mengkoordinasikan mereka dengan Monitor.

Komentar (0)

Cara lain menunggu benang untuk menyelesaikan menggunakan 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();
}
Komentar (0)

Jika saya'm membaca ini dengan benar, anda're awal item pekerjaan pada sekelompok benang tetapi anda're bersangkutan bahwa benang yang menyelesaikan keluar dari ketertiban, dan, akan lebih memilih untuk menunggu sampai masing-masing thread melengkapi dalam urutan mereka mulai ?

Jika hal ini terjadi maka saya'm tidak yakin mengapa anda're menciptakan benang per item pekerjaan. Mungkin anda bisa memperluas?

Jika anda tidak perlu menunggu untuk sebuah thread untuk menyelesaikan anda hanya bisa melakukan:

t.Join();
Komentar (0)