Baru-baru ini saya sedang mengerjakan ConsoleApp untuk penjadwalan pekerjaan. Artikel ini tidak akan membahas bagian penjadwalan pekerjaan untuk saat ini (saya akan menulisnya nanti).
Persyaratan menjalankan ConsoleApp
1. Mulai aplikasi saat sistem dijalankan;
2. Satu instance berjalan di setiap sesi;
Saat membuka tautan desktop jarak jauh, hanya satu instance ConsoleApp yang diperbolehkan untuk dimulai.
3. Hanya satu instance yang dapat berjalan di dalam sistem;
Ketika beberapa tautan desktop jarak jauh dibuka, hanya satu contoh ConsoleApp yang diizinkan untuk dimulai.
muteks
Mutex: Primitif sinkronisasi yang juga dapat digunakan untuk sinkronisasi antar proses.
MSND yang terlihat: http://msdn.microsoft.com/zh-cn/library/system.threading.mutex.aspx
Dalam pendahuluan dokumen resmi terdapat paragraf ini
Pada server yang menjalankan Layanan Terminal, sistem bernama mutex dapat memiliki dua tingkat visibilitas. Jika nama dimulai dengan awalan "Global", mutex terlihat di semua sesi server terminal. Jika nama dimulai dengan awalan "Lokal", mutex hanya terlihat di sesi server terminal tempat mutex dibuat. Dalam hal ini, Anda dapat memiliki mutex terpisah dengan nama yang sama di setiap sesi server terminal lainnya di server. Jika mutex bernama dibuat tanpa menentukan awalan, maka akan menggunakan awalan "Lokal". Dalam sesi server terminal, dua mutex yang hanya berbeda pada awalan namanya adalah mutex independen, dan kedua mutex ini terlihat oleh semua proses dalam sesi server terminal. Yaitu: nama awalan "Global" dan "Lokal" menunjukkan cakupan nama mutex yang berhubungan dengan sesi server terminal (bukan relatif terhadap proses).
Sayangnya, tidak ada contoh C# yang ditemukan.
mutexName= "Lokal\" +"Nama Aplikasi";
Ini hanya valid untuk sesi pembuatannya, yang berarti bahwa ketika koneksi jarak jauh baru dibuka, instance ConsoleApp akan dimulai lagi.
mutexName= "Global\" +"Nama Aplikasi";
Berlaku untuk semua sesi. Ketika beberapa tautan jarak jauh dibuka, hanya tautan jarak jauh pertama yang berhasil memulai instance ConsoleApp.
Jalankan sebagai satu instance per sesi
kekosongan statis pribadi LocalMutex()
{
// Apakah akan membuat mutex untuk pertama kalinya
bool newMutexCreated = salah;
string mutexName = "Lokal\" + "tenghoo";
Mutex mutex = nol;
mencoba
{
mutex = new Mutex(false, mutexName, keluar newMutexCreated);
}
menangkap (Pengecualian ex)
{
Console.Write(mis.Pesan);
Sistem.Threading.Thread.Tidur(3000);
Lingkungan.Keluar(1);
}
// Buat mutex untuk pertama kalinya
jika (newMutexDibuat)
{
Console.WriteLine("Program telah dimulai");
//todo: Inilah tugas yang harus dilakukan
}
kalau tidak
{
Console.Write("Jendela lain sudah berjalan dan akan ditutup secara otomatis setelah 3 detik...");
Sistem.Threading.Thread.Tidur(1000);
Konsol.Tulis("1");
Sistem.Threading.Thread.Tidur(1000);
Konsol.Tulis("2");
Sistem.Threading.Thread.Tidur(1000);
Konsol.Tulis("3");
Lingkungan.Keluar(1);//Keluar dari program
}
}
Operasi instans tunggal di seluruh sistem
kekosongan statis pribadi GlobalMutex()
{
// Apakah akan membuat mutex untuk pertama kalinya
bool newMutexCreated = salah;
string mutexName = "Global\" + "tenghoo";
Mutex mutex = nol;
mencoba
{
mutex = new Mutex(false, mutexName, keluar newMutexCreated);
}
menangkap (Pengecualian ex)
{
Console.Write(mis.Pesan);
Sistem.Threading.Thread.Tidur(3000);
Lingkungan.Keluar(1);
}
// Buat mutex untuk pertama kalinya
jika (newMutexDibuat)
{
Console.WriteLine("Program telah dimulai");
//todo: Inilah tugas yang harus dilakukan
}
kalau tidak
{
Console.Write("Jendela lain sudah berjalan dan akan ditutup secara otomatis setelah 3 detik...");
Sistem.Threading.Thread.Tidur(1000);
Konsol.Tulis("1");
Sistem.Threading.Thread.Tidur(1000);
Konsol.Tulis("2");
Sistem.Threading.Thread.Tidur(1000);
Konsol.Tulis("3");
Lingkungan.Keluar(1);//Keluar dari program
}