Apa itu kode keluar utas?

115

Apa sebenarnya kode keluar utas di jendela Output saat debugging? Informasi apa yang diberikannya kepada saya? Apakah itu berguna atau hanya hal internal yang seharusnya tidak mengganggu saya?

The thread 0x552c has exited with code 259 (0x103).
The thread 0x4440 has exited with code 0 (0x0).

Apakah mungkin ada semacam daftar kode keluar yang mungkin beserta signifikansinya?

Ondrej Janacek
sumber

Jawaban:

100

Sebenarnya tampaknya tidak ada banyak penjelasan tentang subjek ini, tetapi kode keluar seharusnya digunakan untuk memberikan indikasi tentang bagaimana utas keluar, 0cenderung berarti bahwa itu keluar dengan aman sementara hal lain cenderung berarti tidak keluar seperti yang diharapkan. Tapi kemudian kode keluar ini dapat diatur dalam kode sendiri untuk mengabaikan ini sepenuhnya.

Tautan terdekat yang menurut saya berguna untuk informasi lebih lanjut adalah ini

Kutipan dari tautan di atas:

Apa pun metode keluarnya, bilangan bulat yang Anda kembalikan dari proses atau utas harus berupa nilai dari 0-255 (8bits). Nilai nol menunjukkan keberhasilan, sedangkan nilai bukan nol menunjukkan kegagalan. Meskipun, Anda dapat mencoba mengembalikan nilai integer apa pun sebagai kode keluar, hanya byte terendah dari integer yang dikembalikan dari proses atau utas Anda sebagai bagian dari kode keluar. Byte orde tinggi digunakan oleh sistem operasi untuk menyampaikan informasi khusus tentang proses tersebut. Kode keluar sangat berguna dalam program batch / shell yang secara kondisional menjalankan program lain tergantung pada berhasil atau tidaknya program tersebut.


Dari Dokumentasi untuk GetEXitCodeThread

Penting Fungsi GetExitCodeThread mengembalikan kode kesalahan valid yang ditentukan oleh aplikasi hanya setelah utas berakhir. Oleh karena itu, aplikasi tidak boleh menggunakan STILL_ACTIVE (259) sebagai kode kesalahan. Jika utas mengembalikan STILL_ACTIVE (259) sebagai kode kesalahan, aplikasi yang menguji nilai ini dapat menafsirkannya sebagai bahwa utas masih berjalan dan terus menguji penyelesaian utas setelah utas dihentikan, yang dapat menempatkan aplikasi menjadi loop tak terbatas.


Pemahaman saya tentang semua ini adalah bahwa kode keluar tidak terlalu menjadi masalah jika Anda menggunakan utas dalam aplikasi Anda sendiri untuk aplikasi Anda sendiri. Pengecualian untuk ini mungkin jika Anda menjalankan beberapa utas pada saat yang sama yang memiliki ketergantungan satu sama lain. Jika ada persyaratan bagi sumber luar untuk membaca kode kesalahan ini, Anda dapat mengaturnya agar aplikasi lain mengetahui status utas Anda.

Ucapkan se
sumber
1
Apakah ada cara untuk menghilangkannya dari jendela Output?
Arne Evertsson
26
@ArneEvertsson - Jika Anda masuk ke Tools | Options ... di bawah area "Debugging \ Output Window", ada pengaturan "Thread Exit Messages" (On | Off).
josh poley
2
Ini dapat berarti bahwa Anda menggunakan metode asinkron dalam utas utama aplikasi sinkron dan tidak menunggu metode tersebut selesai. Cara termudah untuk mengatasinya adalah dengan memanggil Wait () pada Tugas yang dimulai dan dikembalikan dengan metode lain seperti yang ditunjukkan dalam contoh ini: asp.net/web-api/overview/advanced/… RunAsync().Wait();
Bron Davies
1
@BronDavies thread-pool thread keluar dengan kode kesalahan 259 bahkan setelah memanggil Wait (). Ini kode saya: static void Main(string[] args) { var t = new Task<object>(() => SomeOp(2)); t.Start(); t.Wait(); }Masalahnya, Tugas dijalankan oleh utas kumpulan utas dan berdasarkan heuristik kumpulan utas itu mungkin tidak menghentikan utas bahkan setelah tugas Anda selesai. Utas hanya kembali ke kumpulan utas menunggu untuk ditugaskan dengan tugas berikutnya. Dan itulah mengapa kode keluar STILL_ACTIVE (259) terdengar sangat intuitif di sini.
RBT
Artikel di tautan salah. Tidak ada persyaratan bahwa kode keluar utas (atau kode keluar proses, dalam hal ini) hanya satu byte.
Harry Johnston
55

Seperti yang disebutkan Sayse, kode keluar 259 (0x103)memiliki arti khusus, dalam hal ini proses yang sedang di-debug masih berjalan.

Saya sering melihat ini dengan layanan web debugging, karena utas terus berjalan setelah menjalankan setiap panggilan layanan web (karena masih mendengarkan panggilan lebih lanjut).

Kristian Williams
sumber
7
Info lebih lanjut .. umumnya semua utas yang dimiliki oleh kumpulan utas akan keluar dengan 259. Lihat: stackoverflow.com/questions/21632584/…
Skrymsli
Saya bertanya-tanya apa artinya ini, dan jawaban Anda persis seperti yang saya lihat saat menjalankan aplikasi konsol C # saya. Terima kasih!
kayleeFrye_onDeck
0

apa yang terjadi pada saya adalah saya memiliki banyak proyek dalam solusi saya. Saya bermaksud men-debug proyek 1, namun, proyek 2 ditetapkan sebagai proyek awal default. Saya memperbaikinya dengan, klik kanan pada proyek dan pilih "Set as startup project", kemudian menjalankan debugging baik-baik saja.

Feng Zhang
sumber
1
Saya tidak melihat pesan debugging di jendela Output sebagai masalah. Saya hanya ingin tahu apa itu, bukan bagaimana cara menyingkirkannya.
Ondrej Janacek