2012-05-16 7 views
5

Tôi đang làm việc trên ứng dụng đa cá thể. Có cách nào trong C# để biết rằng có bao nhiêu trường hợp đang chạy hiện tại.
Tôi đã sử dụng một mã nhỏ để đếm các quy trình cửa sổ của tên ứng dụng của tôi nhưng đó không phải là cách tốt.thực hiện semaphore để đếm số. các cá thể hiện đang chạy

string fileName = Process.GetCurrentProcess().MainModule.FileName; 
int count = 0; 
foreach (Process p in Process.GetProcesses()) 
{ 
    try 
    { 
     if (p.MainModule.FileName == fileName) 
     { 
      count++; 
     } 
    } 
    catch { } 
} 

MessageBox.Show("Total Instances Running are " + count); 


Nó có thể được thực hiện bằng cách sử dụng semaphore hoặc một số tăng và sụt lần truy cập đó được tăng lên bởi một khi trường hợp mới được tạo ra và sụt lần bởi một khi một trường hợp đóng cửa.

Trả lời

1

A Semaphore giúp bạn đếm ngược, chặn bạn khi bạn đến 0. Bạn có thể sử dụng semaphore toàn cầu, nhưng bạn sẽ phải khởi tạo nó ở giá trị đủ cao và bắt đầu đếm ngược.

Tôi nghĩ rằng tất cả trong tất cả, giải pháp của riêng bạn có lẽ là sạch nhất.

+0

cảm ơn câu trả lời. U có thể cho tôi biết một số tài nguyên khác ngoại trừ msdn. –

+0

Google? https://www.google.co.il/search?q=.net+semaphore&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a – zmbq

+0

Sự cố với Semaphore lớp học là bạn không thể có được số mà không phát hành nó, mà có thể sản xuất một số mã khá lộn xộn ... –

1

Tại sao bạn không sử dụng bộ nhớ dùng chung? Tất nhiên bạn phải bảo vệ nó bằng một mutex hiển thị cho tất cả các quy trình, nhưng theo cách này bạn có thể lưu trữ dữ liệu thường được sử dụng trong tất cả các quy trình.

Tôi cho rằng bạn phải thực hiện thường trình nền tảng P/Gọi để tạo bộ nhớ dùng chung nhưng thực sự rất đơn giản.

1

Quản lý nhiều quy trình không bao giờ không phải là vấn đề. Hệ điều hành đặt một bức tường lớn giữa chúng làm cho nó chỉ là về bất cứ điều gì khó khăn và tốn kém. Mã bạn đang sử dụng không là ngoại lệ, việc lặp lại các quy trình đang chạy là tốn kém. Trước tiên hãy cân nhắc việc sử dụng các luồng thay vì tìm kiếm AppDomain trong một chương trình .NET, một tính năng được phát minh rõ ràng để cung cấp loại cách ly mà quy trình có thể cung cấp nhưng không có chi phí của việc chặn rào cản interop.

Nếu bạn cam kết một giải pháp đa quy trình thì bạn hầu như luôn luôn cần một quy trình riêng biệt hoạt động như một trọng tài. Chịu trách nhiệm đảm bảo quy trình công nhân bắt đầu và làm điều gì đó có ý nghĩa khi một trong số họ chết vì một ngoại lệ chưa được giải quyết. Đó là chính nó một cái gì đó đó là rất khó để đối phó với vì không có cách nào tốt để có được bất kỳ thông tin về lý do nó chết và bạn bị mất một số lượng rất lớn của nhà nước. Các kết quả điển hình là một sự cố của toàn bộ ứng dụng trừ khi bạn cung cấp cho các quá trình này những điều rất đơn giản để làm điều đó bạn có thể dễ dàng làm mà không có.

Quy trình trọng tài như vậy không có sự cố khi đếm các trường hợp giá rẻ, nó có thể sử dụng sự kiện Process.Exited để duy trì bộ đếm. Một sự kiện thay vì phải thăm dò ý kiến.