Chạy 1 chuơng trình dạng single-instance là 1 vấn đề thường gặp phải và rất cần thiết trong nhiều ứng dụng, ví dụ như 1 chuơng trình antivirus cho dù bạn có chạy nó nhiều lần nhưng cũng chỉ có 1 instance AV duy nhất được chạy. Các lần cố gắng khởi động AV sau sẽ vô hiệu lực. Sẽ rất là “củ chuối” nếu như bạn cho phép chạy nhiều instance 1 chuơng trình cùng lúc chỉ để làm 1 công việc, thay vì gợi í người dùng kích hoạt cửa sổ chuơng trình đã mở sẵn, tệ hơn nữa trong những trường hợp xử lý cùng dữ liệu.
-Có 1 số cách để giải quyết vấn đề này, hay gặp là sử dụng Mutex và Process. Tuy nhiên chúng chỉ kiểm tra xem 1 instance của chuơng trình có đang chạy hay ko và ko thể điều khiển được instance đó (như việc active cửa sổ chính chẳng hạn).
Thông thường thì cách dùng Mutex sẽ hiệu quả hơn cách kiểm tra các process. Việc lặp qua mảng process và kiểm tra dựa vào processName sẽ ko thể chính xác, vì thế nếu muốn tăng độ chính xác này thì cần kiểm tra thêm 1 vài thông tin về tên gốc, số phiên bản,….
Cách thực hiện
Bây giờ mình sẽ hướng dẫn sử dụng 1 cách khá mới tận dụng thư viện Visual Basic trong .Net. Trước khi gõ code bạn hãy add reference thư viện Microsoft.VisualBasic vào.
Phải add thư viện này bạn mới có thể dùng using Microsoft.VisualBasic.ApplicationServices mà ta sẽ sử dụng trong bài được.
Sửa file Program.cs như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
using System; using System.Collections.Generic; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Threading; using Microsoft.VisualBasic.ApplicationServices; namespace WindowsApplication1 { static class Program { // Form chính cần gọi của chương trình phải đặt là static static Form1 frm; [STAThread] static void Main(string[] args) { Application.EnableVisualStyles(); frm = new Form1(); SingleInstanceApplication.Run(frm, NewInstanceHandler); } public static void NewInstanceHandler(object sender, StartupNextInstanceEventArgs e) { // Kích hoạt cửa sổ của instance đang chạy // Bạn có thể thay thế bằng 1 hành động khác frm.Activate(); } /// <summary> /// Lớp này dùng để gọi chạy form dạng single instance /// </summary> public class SingleInstanceApplication : WindowsFormsApplicationBase { private SingleInstanceApplication() { base.IsSingleInstance = true; } public static void Run(Form f, StartupNextInstanceEventHandler startupHandler) { SingleInstanceApplication app = new SingleInstanceApplication(); app.MainForm = f; app.StartupNextInstance += startupHandler; app.Run(Environment.GetCommandLineArgs()); } } } } |
Như bạn có thể thấy
app.Run(Environment.GetCommandLineArgs()); |
Bạn có thể dễ dàng điều khiển instance đã chạy của mình bằng cách thiết lập các hành động sẽ xử lý tùy thuộc vào các tham số sẽ truyền vào thông qua dòng lệnh. Khi đó bạn có thể khởi tạo form như sau:
Code:
frm=new Form1(args[0]);
và trong constructor của Form1 bạn sẽ viết code kiểm tra và xử lý, ví dụ args[0]==”/scan” thì thực hiện lệnh scan máy chẳng hạn.
Hi vọng bài viết này giúp đỡ giải quyết 1 số vấn đề mà các bạn gặp phải.