Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Membuat Satu Benang Menunggu yang Lain dalam .NET?

Bagaimana untuk Membuat Satu Benang Menunggu yang Lain dalam .NET?

Patricia Arquette
Patricia Arquetteasal
2025-01-21 19:50:11148semak imbas

How to Make One Thread Wait for Another in .NET?

Penjelasan terperinci tentang mekanisme menunggu berbilang benang .NET

Apabila berurusan dengan berbilang benang dalam .NET, terutamanya apabila digabungkan dengan urutan UI utama, mengurus susunan pelaksanaan benang adalah penting. Artikel ini meneroka beberapa strategi untuk membuat satu utas menunggu sehingga satu lagi urutan selesai.

Keperluan ini timbul apabila satu utas (contohnya, utas UI utama) perlu menunggu urutan lain menyelesaikan tugasnya sebelum meneruskan. Terdapat pelbagai cara untuk mencapai tingkah laku ini:

1. Benang.Sertai:

<code>Thread t1 = new Thread(new ThreadStart(action1));
t1.Start();
t1.Join();</code>

Thread.Join menyekat urutan panggilan (dalam kes ini, utas UI utama) sehingga urutan yang ditentukan (t1 dalam contoh) menyelesaikan pelaksanaan. Walaupun kaedah ini mudah dan mudah, ia boleh menyebabkan UI menjadi beku.

2. WaitHandles:

<code>ManualResetEvent resetEvent = new ManualResetEvent(false);
Thread t1 = new Thread(new ThreadStart(() =>
{
    // 执行任务并在完成时发出信号
    resetEvent.Set();
}));
t1.Start();
resetEvent.WaitOne(); // 阻塞直到 resetEvent 发出信号</code>

WaitHandles (seperti ManualResetEvent) memberikan kawalan yang lebih halus. Di sini, resetEvent digunakan untuk menunjukkan penyiapan benang t1. Benang utama menyekat pada WaitOne() sehingga acara ditetapkan, membolehkannya meneruskan pelaksanaan.

3

Acara menyediakan cara untuk urutan menyampaikan status penyiapannya. ThreadWorker menimbulkan acara selepas tugasnya selesai, yang kemudiannya dikendalikan dalam kaedah HandleThreadDone.
<code>ThreadWorker worker = new ThreadWorker();
worker.ThreadDone += HandleThreadDone;

Thread t1 = new Thread(worker.Run);
t1.Start();

void HandleThreadDone(object sender, EventArgs e)
{
    // 线程 `t1` 完成时执行操作
}</code>

4. Perwakilan:

Perwakilan boleh digunakan untuk menghantar kaedah sebagai parameter kepada utas. Apabila ThreadWorker menyelesaikan tugasnya, wakil HandleThreadDone dipanggil, membenarkan utas utama meneruskan pelaksanaan.
<code>ThreadWorker worker = new ThreadWorker();

Thread t1 = new Thread(worker.Run);
t1.Start(HandleThreadDone);

void HandleThreadDone()
{
    // 线程 `t1` 完成时执行操作
}</code>

5. Pengaturcaraan tak segerak:

Anda boleh menggunakan teknik pengaturcaraan tak segerak, seperti menggunakan perwakilan dan pengendali acara dengan kata kunci Tugas atau async/menunggu, untuk mengelakkan sekatan benang dan mengurus aliran pelaksanaan dengan cekap.

Mengendalikan penyegerakan benang:

Apabila menggunakan acara atau perwakilan, pastikan anda mempertimbangkan penyegerakan rangkaian. Kaedah pengendali acara/wakilkan mungkin dilaksanakan pada urutan yang menimbulkan acara/memanggil perwakilan, tidak semestinya urutan UI utama. Untuk mengemas kini antara muka pengguna, anda mungkin perlu memanggil kaedah pengendali pada utas UI utama menggunakan Invoke atau InvokeRequired.

Atas ialah kandungan terperinci Bagaimana untuk Membuat Satu Benang Menunggu yang Lain dalam .NET?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn