Ketika saya mendapatkan referensi ke System.Diagnostics.Process
, bagaimana saya bisa tahu jika suatu proses sedang berjalan?
155
Ini adalah cara untuk melakukannya dengan nama:
Process[] pname = Process.GetProcessesByName("notepad");
if (pname.Length == 0)
MessageBox.Show("nothing");
else
MessageBox.Show("run");
Anda dapat mengulang semua proses untuk mendapatkan ID untuk manipulasi nanti:
Process[] processlist = Process.GetProcesses();
foreach(Process theprocess in processlist){
Console.WriteLine("Process: {0} ID: {1}", theprocess.ProcessName, theprocess.Id);
}
if/else
pernyataan C # yang panjangnya hanya satu baris tidak perlu memiliki kurung kurawal untuk mengindikasikan pernyataan blok. Ini juga berlaku untukforeach
danfor
pernyataan. Itu bermuara pada gaya pengkodean.for
info itu. Tahun c # .net dev dan saya belum pernah melihat gaya ini. Seperti yang mereka katakan, "kamu belajar sesuatu yang baru setiap hari". Terima kasih atas kiriman dan jawabannya ..Ini adalah cara paling sederhana yang saya temukan setelah menggunakan reflektor. Saya membuat metode ekstensi untuk itu:
The
Process.GetProcessById(processId)
Metode menyebutProcessManager.IsProcessRunning(processId)
metode dan melemparArgumentException
dalam hal proses tidak ada. Untuk beberapa alasanProcessManager
kelas ini internal ...sumber
Solusi sinkron:
Solusi asinkron:
sumber
reshefm punya jawaban yang cukup bagus; namun, itu tidak menjelaskan situasi di mana prosesnya tidak pernah dimulai.
Ini adalah versi modifikasi dari apa yang dia posting.
Saya menghapus ArgumentNullException-nya karena sebenarnya seharusnya menjadi pengecualian referensi nol dan itu akan dilemparkan oleh sistem dan saya juga menjelaskan situasi di mana proses tidak pernah dimulai dengan memulai atau metode close () digunakan untuk menutup proses.
sumber
Ini harus satu kalimat:
sumber
Tergantung pada seberapa andal Anda menginginkan fungsi ini. Jika Anda ingin tahu apakah proses proses tertentu yang Anda miliki masih berjalan dan tersedia dengan akurasi 100% maka Anda kurang beruntung. Alasannya adalah bahwa dari objek proses yang dikelola hanya ada 2 cara untuk mengidentifikasi proses.
Yang pertama adalah Id Proses. Sayangnya, id proses tidak unik dan dapat didaur ulang. Mencari daftar proses untuk Id yang cocok hanya akan memberi tahu Anda bahwa ada proses dengan id yang sama berjalan, tetapi itu belum tentu proses Anda.
Item kedua adalah Pegangan Proses. Ini memiliki masalah yang sama meskipun sebagai ID dan lebih canggung untuk bekerja dengannya.
Jika Anda mencari keandalan tingkat menengah maka memeriksa daftar proses saat ini untuk proses ID yang sama sudah cukup.
sumber
Process.GetProcesses()
adalah cara untuk pergi. Tetapi Anda mungkin perlu menggunakan satu atau lebih kriteria yang berbeda untuk menemukan proses Anda, tergantung pada bagaimana prosesnya berjalan (yaitu sebagai layanan atau aplikasi normal, apakah memiliki tajuk atau tidak).sumber
Mungkin (mungkin) saya salah membaca pertanyaan, tetapi apakah Anda mencari properti HasExited yang akan memberi tahu Anda bahwa proses yang diwakili oleh objek Proses Anda telah keluar (baik secara normal atau tidak).
Jika proses yang Anda rujuk memiliki UI, Anda dapat menggunakan properti Respons untuk menentukan apakah UI saat ini merespons input pengguna atau tidak.
Anda juga dapat mengatur EnableRaisingEvents dan menangani acara Keluar (yang dikirim secara serempak) atau menelepon WaitForExit () jika Anda ingin memblokir.
sumber
Anda dapat instantiate contoh Proses sekali untuk proses yang Anda inginkan dan terus melacak proses menggunakan objek NET. Proses (itu akan terus melacak sampai Anda memanggil Tutup objek NET. Secara eksplisit, bahkan jika proses itu pelacakan telah mati [ini untuk memberi Anda waktu proses dekat, alias ExitTime dll.])
Mengutip http://msdn.microsoft.com/en-us/library/fb4aw7b8.aspx :
sumber
Saya mencoba solusi Coincoin:
Sebelum memproses beberapa file, saya menyalinnya sebagai file sementara dan membukanya.
Setelah selesai, saya menutup aplikasi jika masih terbuka dan menghapus file sementara:
Saya hanya menggunakan variabel Proses dan memeriksanya setelahnya:
Kemudian saya menutup aplikasi:
Berhasil (sejauh ini)
sumber
openApplication.HasExited()
, HasExited bukan fungsi. Cara yang benar adalahopenApplication.HasExited
.Meskipun didukung API dari .Net frameworks tentang memeriksa proses yang ada dengan proses ID, fungsi-fungsi tersebut sangat lambat. Biayanya sejumlah besar siklus CPU untuk menjalankan Process.GetProcesses () atau Process.GetProcessById / Name ().
Metode yang jauh lebih cepat untuk memeriksa proses yang berjalan dengan ID adalah dengan menggunakan API asli OpenProcess () asli . Jika pegangan kembali adalah 0, prosesnya tidak ada. Jika pegangan berbeda dari 0, proses sedang berjalan. Tidak ada jaminan metode ini akan bekerja 100% setiap saat karena izin.
sumber
Ada banyak masalah yang terkait dengan hal ini, karena sebagian lainnya tampaknya mengatasi sebagian:
Apakah properti yang disebutkan orang lain adalah internal atau tidak, Anda masih dapat memperoleh informasi dari mereka melalui refleksi jika izin memungkinkan.
Anda bisa menyematkan kode Win32 untuk Snapshot atau Anda dapat menggunakan WMI yang lebih lambat.
Opsi lain adalah OpenProcess / CloseProcess, tetapi Anda masih akan mengalami masalah yang sama dengan pengecualian yang dilemparkan sama seperti sebelumnya.
Untuk WMI - OnNewEvent.Properties ["?"]:
sumber
Anda juga dapat menggunakan timer untuk memeriksa proses setiap waktu
sumber
length == 0
harus ditampilkanNot Working
) tetapi masih menyelesaikan pekerjaan.