C# – Tạo chương trình dạng Single-instance

CSharp_iconChạ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.

AddReference

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:


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

Trích dẫn:
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.

https://yinyangit.wordpress.com

Advertisements

4 thoughts on “C# – Tạo chương trình dạng Single-instance

  1. – StartupNextInstanceEventHandler là delegate dùng để quản lý sự kiện một instance khác của ứng dụng được thực thi. Bạn có thể nhận ra điều này quan chuỗi “EventHandler” nếu đã quen thuộc với event trong .NET.

    – Environment.GetCommandLineArgs(): Lấy về các tham số mà bạn truyền cho ứng dụng hiện tại. Nếu đã từng làm việc với Command Prompt thì khi sử dụng một chương trình, bạn cần truyền các chuỗi tham số phía sau tên chương trình để xác định công việc mà chương trình cần làm. Trong ví dụ này, ta sẽ lấy chuỗi tham số đó và truyền nó đến instance sắp được thực thi.

    Trả lời

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s