2010-08-02 32 views
9

Tôi có một ứng dụng bảng điều khiển và tôi muốn nó chờ đến khi một số sự kiện được nâng lên. Nhưng nó thực thi mã và lối thoát hiểm:Làm cho ứng dụng giao diện điều khiển hoạt động giống như ứng dụng Windows

static void Main(string[] args) 
{ 
    var someObjectInstance = new SomeObject(); 
    someObjectInstance.SomeEvent += SomeEventHandler; 
} 

static void SomeEventHandler() 
{ 
    //Some logic 
} 

Tôi muốn làm cho ứng dụng của tôi cư xử giống như một ứng dụng Windows mà

Application.Run(new Form1()); 

được gọi và vòng lặp thông điệp được chạy.

Nhưng tôi không cần vòng lặp tin nhắn cũng như bất kỳ biểu mẫu nào. Vì vậy, nó trông giống như trên cao. Có cách nào nhẹ hơn để đạt được mục tiêu của tôi không?

+2

gì * khía cạnh * về hành vi của một ứng dụng Windows Forms được bạn thực sự tìm kiếm? Điều gì sẽ nâng cao sự kiện đó? –

+0

Tôi muốn có thể chờ một số sự kiện và sau đó thoát ứng dụng theo cách thủ công. WinForms thực hiện hành vi tương tự bằng phương thức Application.Run. Đó là sự kiện ConnectionLost được tạo bởi lớp IPC dựa trên ổ cắm. – SiberianGuy

Trả lời

18

Trước hết, trừ khi SomeObject sẽ nâng cao sự kiện trên một chủ đề riêng biệt, điều này sẽ không làm việc nếu không có mẫu xử lý trong SomeObject. Nếu nó được thiết kế theo cách đó, tuy nhiên, điều này là khá đơn giản.

Một cách rất hiệu quả xử lý này là chỉ cần chờ đợi vào một WaitHandle:

private static ManualResetEvent waitHandle = new ManualResetEvent(false); 
static void Main(string[] args) 
{ 
    var someObjectInstance = new SomeObject(); 
    someObjectInstance.SomeEvent += SomeEventHandler; 
    waitHandle.WaitOne(); // Will block until event occurs 
} 

static void SomeEventHandler() 
{ 
    //some logic 
    waitHandle.Set(); // Will allow Main() to continue, exiting the program 
} 
+0

Không gian tên 'ManualResetEvent' là gì? – ArtOfCode

+0

@ArtOfCode System.Threading: https://msdn.microsoft.com/en-us/library/system.threading.manualresetevent%28v=vs.110%29.aspx Mặc dù tôi muốn giới thiệu 'ManualResetEventSlim' hôm nay ... –

+0

Heh. Đừng lo lắng; Tôi đã tìm thấy một cách khác để làm điều đó vì vậy tôi sẽ không thực sự được sử dụng này. – ArtOfCode

2

Thêm

Console.ReadLine(); sau khi bạn đính kèm tổ chức sự kiện của mình.

Ví dụ ..

class Program 
{ 
    static void Main(string[] args) 
    { 
     System.IO.FileSystemWatcher watcher = new System.IO.FileSystemWatcher(@"c:\", "*.txt"); 
     watcher.Created += new System.IO.FileSystemEventHandler(watcher_Created); 
     watcher.EnableRaisingEvents = true; 
     Console.ReadLine(); 
    } 

    static void watcher_Created(object sender, System.IO.FileSystemEventArgs e) 
    { 
     Console.WriteLine(string.Format("{0} was created at {1:hh:mm:ss}", e.FullPath, DateTime.Now)); 
    } 
} 
+1

Điều đó sẽ chỉ khiến ứng dụng Console bị treo mãi mãi, trừ khi ai đó nhập vào Bàn điều khiển ... Không chắc đó là hành vi thích hợp ở đây, vì nó không liên quan gì đến việc chờ đợi sự kiện (bên ngoài). –

+0

Tuyệt vời để thử nghiệm ... rất tuyệt vời cho mã sản xuất. –

+0

trong sản xuất Tôi sẽ sử dụng một dịch vụ cho ví dụ cụ thể này. Nhưng điều này không hoạt động tốt. –

-1

EDIT: Đáng buồn thay, tôi đã sai và điều này sẽ không làm việc, vì Application không được định nghĩa cho một ứng dụng giao diện điều khiển (Cảm ơn bạn, Reed Copsey).

Điều này nên thực hiện thủ thuật, mặc dù tùy thuộc vào thời gian bạn chọn bạn có thể sẽ ngừng CPU. Tôi cảm thấy như phải có một cách an toàn hơn để làm điều này?

while (true) 
{ 
    Application.DoEvents(); 
    Thread.Sleep(this.SleepTime); 
} 

+1

Tính năng này chỉ hoạt động nếu bạn có bơm thông báo Windows Forms, không bao giờ nằm ​​trong ứng dụng Console ... "Ứng dụng" chỉ được xác định trên các ứng dụng Windows Forms. Ngoài ra, ngủ như thế này có lẽ không phải là cách tiếp cận tốt nhất, trong mọi trường hợp. –

Các vấn đề liên quan