2012-08-23 44 views
5

Tôi có mã cơ bản này để kiểm tra xem có chạy notepad mỗi phút không.Kiểm tra Nếu quá trình đang chạy từng phút

namespace Watcher 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      for (int i = 0; ; i--) 
      { 
       foreach (Process clsProcess in Process.GetProcesses()) 
       { 
        if (clsProcess.ProcessName.Contains("notepad")) 
        { 
         Console.WriteLine("True"); 
        } 
        Console.WriteLine("NFalse"); 
       } 
       Thread.Sleep(10000); 
      } 
     } 
    } 
} 

Vấn đề là nó trả về "NFalse" cho mọi quy trình đang chạy (Ví dụ: sẽ in 100 ví dụ). Làm thế nào tôi có thể thực hiện in ấn này một lần để cho thấy rằng quá trình này không chạy?

Trả lời

7

Làm mới mã của bạn.

Bạn đang làm quá nhiều trong một phương pháp. Đặt mã của bạn để kiểm tra để xem nếu notepad đang chạy vào một phương pháp riêng biệt:

static bool CheckIfProcessIsRunning(string nameSubstring) 
{ 
    foreach (Process clsProcess in Process.GetProcesses()) 
    { 
     if (clsProcess.ProcessName.Contains(nameSubstring)) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

Bạn có thể đơn giản hóa này tiếp tục sử dụng LINQ:

static bool CheckIfProcessIsRunning(string nameSubstring) 
{ 
    return Process.GetProcesses().Any(p => p.ProcessName.Contains(nameSubstring)); 
} 

Một khi bạn đã viết phương pháp này, tất cả những gì còn lại là gọi nó và in đúng thông điệp tùy thuộc vào việc nó trả về true hay false.

while (true) 
{ 
    string message = CheckIfProcessIsRunning("notepad") ? "True" : "NFalse"; 
    Console.WriteLine(message); 
    Thread.Sleep(10000); 
} 

Bây giờ thay vì một phương pháp dài với logic phức tạp, bạn có hai phương pháp rất đơn giản.

+0

Một tham chiếu đối tượng là cần thiết cho các phi trường tĩnh, phương pháp, hoặc tài sản 'Watcher.Program.CheckIfProcessIsRunning (string) tôi có được điều này khi sử dụng CheckIfProcessIsRunning ('notepad') – user1372896

+0

@ user1372896: Tôi cập nhật để làm cho phương thức tĩnh. –

2

Bạn chỉ cần kiểm tra quy trình bạn quan tâm. Đừng bận tâm lặp qua tất cả các quy trình đang chạy. Sử dụng Process.GetProcessByName().

for (int i = 0; ; i--) 
{ 
    Process[] processes = Process.GetProcessByName("notepad++.exe"); 
    if(processes.Length > 0){ 
      Console.WriteLine("True"); 
    } 
    else{ 
      Console.WriteLine("NFalse"); 
    } 

    Thread.Sleep(10000); 
} 
+0

Phải, tôi đã đọc sai câu hỏi ban đầu. Xem chỉnh sửa –

0

Chỉ cần thay đổi điều này, vì vậy bạn chỉ in ra một lần.

var b = false; 
foreach (Process clsProcess in Process.GetProcesses()) 
      { 
       if (clsProcess.ProcessName.Contains("notepad")) 
       { 
        if (!b) b = true; 
       } 
      } 
       Console.WriteLine(b); 
0

Điều này dường như hoạt động tốt.

Dim x = Process.GetProcesses().ToList().FirstOrDefault(Function(p) p.ProcessName.Contains("Notepad")) 
if x Is Nothing then 
    Console.WriteLine("false") 
end if 
Các vấn đề liên quan