Di .NET, apa cara terbaik untuk mencegah beberapa contoh aplikasi berjalan pada waktu yang bersamaan? Dan jika tidak ada teknik "terbaik", apa saja peringatan yang perlu dipertimbangkan dengan setiap solusi?
123
Gunakan Mutex. Salah satu contoh di atas menggunakan GetProcessByName memiliki banyak peringatan. Berikut adalah artikel bagus tentang masalah ini:
http://odetocode.com/Blogs/scott/archive/2004/08/20/401.aspx
[STAThread]
static void Main()
{
using(Mutex mutex = new Mutex(false, "Global\\" + appGuid))
{
if(!mutex.WaitOne(0, false))
{
MessageBox.Show("Instance already running");
return;
}
Application.Run(new Form1());
}
}
private static string appGuid = "c0a76b5a-12ab-45c5-b9d9-d693faa6e7b9";
string appGuid = ((GuidAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), true)[0]).Value;
yang akan mendapatkan panduan rakitan pelaksanasumber
Berikut adalah kode yang Anda perlukan untuk memastikan bahwa hanya satu instance yang berjalan. Ini adalah metode menggunakan mutex bernama.
sumber
Hanselman memiliki posting tentang menggunakan kelas WinFormsApplicationBase dari rakitan Microsoft.VisualBasic untuk melakukan ini.
sumber
Sepertinya ada 3 teknik dasar yang telah disarankan sejauh ini.
Ada peringatan yang saya lewatkan?
sumber
1 - Buat referensi di program.cs ->
2 - Dimasukkan
void Main()
sebagai baris pertama kode ->Itu dia.
sumber
Mutex
? Apakah ada tangkapan?Menggunakan Visual Studio 2005 atau 2008 ketika Anda membuat proyek untuk eksekusi, pada jendela properti di dalam panel "Aplikasi" ada kotak centang bernama "Buat aplikasi contoh tunggal" yang dapat Anda aktifkan untuk mengonversi aplikasi pada aplikasi contoh tunggal .
Berikut adalah tangkapan dari jendela yang saya bicarakan: Ini adalah proyek aplikasi Windows Visual Studio 2008.
sumber
saya mencoba semua solusi di sini dan tidak ada yang berhasil dalam proyek C # .net 4.0 saya. Berharap dapat membantu seseorang di sini solusi yang berhasil untuk saya:
Sebagai variabel kelas utama:
Saat Anda perlu memeriksa apakah aplikasi sudah berjalan:
Saya perlu menutup istance lain hanya dengan beberapa kondisi, ini bekerja dengan baik untuk tujuan saya
sumber
http://en.csharp-online.net/Application_Architecture_in_Windows_Forms_2.0 —Single-Instance_Detection_and_Management
sumber
Setelah mencoba beberapa solusi saya pertanyaannya. Saya akhirnya menggunakan contoh untuk WPF di sini: http://www.c-sharpcorner.com/UploadFile/f9f215/how-to-restrict-the-application-to-just-one-instance/
Di App.xaml:
sumber
Artikel ini hanya menjelaskan bagaimana Anda dapat membuat aplikasi windows dengan kontrol pada jumlah instance-nya atau menjalankan hanya satu instance. Ini adalah kebutuhan yang sangat khas dari aplikasi bisnis. Sudah ada banyak solusi lain yang mungkin untuk mengendalikan ini.
http://www.openwinforms.com/single_instance_application.html
sumber
Gunakan VB.NET! Tidak benar-benar ;)
menggunakan Microsoft.VisualBasic.ApplicationServices;
WindowsFormsApplicationBase dari VB.Net memberi Anda Properti "SingleInstace", yang menentukan Instans lain dan membiarkan hanya satu Instance yang berjalan.
sumber
Ini adalah kode untuk VB.Net
Ini adalah kode untuk C #
sumber
http://www.codeproject.com/KB/cs/SingleInstancingWithIpc.aspx
sumber
Anda harus menggunakan System.Diagnostics.Process.
Lihat: http://www.devx.com/tips/Tip/20044
sumber
(Catatan: ini adalah solusi yang menyenangkan! Ini berfungsi tetapi menggunakan desain GDI + yang buruk untuk mencapai ini.)
Masukkan gambar ke dalam aplikasi Anda dan muat saat memulai. Tahan sampai aplikasi keluar. Pengguna tidak akan dapat memulai instance kedua. (Tentu saja solusi mutex jauh lebih bersih)
sumber
Main()
metode yang bertentangan dengan bagaimana WPF seharusnya bekerja.Dari: Memastikan satu contoh Aplikasi .NET
dan: Mutex Aplikasi Instance Tunggal
Jawaban yang sama dengan @Smink dan @Imjustpondering dengan twist:
FAQ Jon Skeet tentang C # untuk mencari tahu mengapa GC.KeepAlive penting
sumber
Cukup menggunakan a
StreamWriter
, bagaimana dengan ini?dan
sumber
Biasanya ini dilakukan dengan Mutex bernama (gunakan Mutex baru ("nama aplikasi Anda", benar) dan periksa nilai yang dikembalikan), tetapi ada juga beberapa kelas dukungan di Microsoft.VisualBasic.dll yang dapat melakukannya untuk Anda .
sumber
Ini bekerja untuk saya di C # murni. coba / tangkap adalah ketika kemungkinan proses dalam daftar keluar selama loop Anda.
sumber
Pastikan untuk mempertimbangkan keamanan saat membatasi aplikasi ke satu instance:
Artikel lengkap: https://blogs.msdn.microsoft.com/oldnewthing/20060620-13/?p=30813
...
...
Coba atur DACL di mutex Anda, berikut cara .NET: https://msdn.microsoft.com/en-us/library/system.security.accesscontrol.mutexsecurity(v=vs.110).aspx
sumber
Tak satu pun dari jawaban ini berhasil untuk saya karena saya membutuhkan ini untuk bekerja di Linux menggunakan monodevelop. Ini bagus untuk saya:
Panggil metode ini dengan meneruskan ID unik
sumber