Pertanyaan Thread berhenti dan melanjutkan c #


Saya punya beberapa utas, bagaimana saya bisa menjeda / melanjutkannya?


Dari pertanyaan duplikat:

Bagaimana saya bisa menghentikan 5 utas, dan mengingat status mereka. Karena salah satunya makan yang lain sedang berpikir, dll.


4
2018-02-19 19:47


asal


Jawaban:


Jika Anda menggunakan System.Threading.Thread, maka Anda bisa menelepon Suspend dan Resume. Namun ini tidak disarankan. Tidak ada yang tahu apa yang mungkin dilakukan benang saat Anda menelepon Suspend. Jika Anda menelepon Suspend sementara untaian menahan kunci, misalnya, atau memiliki file terbuka untuk akses eksklusif, tidak ada yang bisa mengakses sumber yang terkunci.

Sebagai dokumentasi untuk Thread.Suspend mengatakan:

Jangan gunakan Tangguhkan dan Lanjutkan   metode untuk menyinkronkan aktivitas   dari utas. Anda tidak punya cara untuk mengetahui   kode apa yang sedang dieksekusi suatu thread   Anda menangguhkannya. Jika Anda menangguhkan   benang saat memegang kunci selama   evaluasi izin keamanan, lainnya   utas di AppDomain mungkin   diblokir. Jika Anda menangguhkan utas sementara   itu mengeksekusi konstruktor kelas,   benang lain di AppDomain itu   mencoba menggunakan kelas yang diblokir.   Deadlock dapat terjadi dengan sangat mudah.

Biasanya, Anda mengontrol aktivitas untaian menggunakan primitif sinkronisasi seperti acara. Sebuah utas akan menunggu suatu peristiwa (lihat ke dalam AutoResetEvent dan ManualResetEvent). Atau, jika rangkaian sedang melayani antrean, Anda akan menggunakan sesuatu seperti BlockingCollection sehingga utas dapat menunggu sesuatu untuk dimasukkan ke antrean. Semua teknik menunggu yang tidak sibuk ini jauh lebih baik daripada menunda dan memulai ulang untaian secara acak, dan tidak menderita konsekuensi bencana yang berpotensi.


15
2018-02-19 19:52



Silahkan lihat Monitor.Wait dan Monitor.Pulse dalam contoh pertama- Marc Gravell memiliki contoh bagus yang digunakan dalam antrean di sini.

Di dalamnya sangat mungkin bahwa Anda ingin mempertimbangkan menggunakan Produser / Konsumen antre.


2
2018-02-19 19:53



Anda harus menggunakan teknik sinkronisasi

Sinkronisasi Thread MSDN


2
2018-02-19 19:50



Di utas utama:

ManualResetEvent re = new ManualResetEvent(true);

Di semua utas, di poin "strategis":

re.WaitOne();

Di utas utama, untuk menghentikan utas:

re.Reset();

dan memulai ulang:

re.Set();

1
2018-02-19 22:05



Kamu dapat memakai Suspend() dan Resume().
http://msdn.microsoft.com/en-us/library/system.threading.thread.resume.aspx
http://msdn.microsoft.com/en-us/library/system.threading.thread.suspend.aspx
Anda juga dapat membaca:
Apa cara alternatif untuk menangguhkan dan melanjutkan utas?


0
2018-02-19 19:55