2010-07-07 57 views
3

如何在事件驅動程序中執行主流程時暫停,只要事件引發並處理,直到事件處理程序結束?如何在C#.NET中進行事件驅動編程?

我創建了下面的程序

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Timers; 

namespace EventTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Timer t = new Timer(2000); 
      t.Enabled = true; 
      t.Elapsed += new ElapsedEventHandler(TimerHandler); 
      for (int i = 0; i < 10000; i++) 
      { 
       for (int j = 0; j < 100000000; j++) ; 
       Console.WriteLine(i); 
      } 
     } 
     public static void TimerHandler(object source, EventArgs e) 
     { 
      Console.WriteLine("Event started"); 
      for (int i = 0; i < 5; i++) 
      { 
       for (int j = 0; j < 100000000; j++) ; 
       Console.WriteLine("Event "+i); 
      } 
      Console.WriteLine("Event finished"); 
     } 

    } 
} 

主要方法是應該打印序列號,和一個事件被每2秒燒製。在事件處理期間,程序應該打印「事件已啓動」,「事件1」至「事件5」,然後「事件已完成」,然後返回。

我預期的Main()流停止而TimerHandler()被調用,但是我的輸出顯示,主()和TimerHandler()都同時

0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
Event started 
12 
Event 0 
13 
Event 1 
14 
Event 2 
15 
Event 3 
16 
Event 4 
Event finished 
17 
18 
19 
20 
21 
22 
23 
Event started 
24 
Event 0 
25 
Event 1 
26 
Event 2 
27 
Event 3 
28 
Event 4 
Event finished 
29 
30 
31 
32 
33 

運行是否有可能使主( )方法在事件處理時停止?

+1

另外,小費,如果你想要做的就是讓程序暫停幾毫秒,以便您的測試程序不會運行並完成太快,您可以使用Thread.Sleep(10);睡10毫秒,而不是你的內在循環。 – 2010-07-07 09:56:02

回答

3

您使用System.Timers.Timer,其處理蜱在後臺線程,通常使用線程池。

這樣,是的,它會同時與你的主代碼的其餘部分運行。

關於你的第二個問題,有可能得到主停下來,我需要知道預期的行爲是什麼。

如果你想在TimerHandler整個蜱一起運行,暫停主而它這樣做,簡單的鎖就足夠了:

namespace EventTest 
{ 
    class Program 
    { 
     static object _Lock = new object(); 

     static void Main(string[] args) 
     { 
      Timer t = new Timer(2000); 
      t.Enabled = true; 
      t.Elapsed += new ElapsedEventHandler(TimerHandler); 
      for (int i = 0; i < 10000; i++) 
      { 
       for (int j = 0; j < 100000000; j++) ; 
       lock (_Lock) 
        Console.WriteLine(i); 
      } 
     } 
     public static void TimerHandler(object source, EventArgs e) 
     { 
      lock (_Lock) 
      { 
       Console.WriteLine("Event started"); 
       for (int i = 0; i < 5; i++) 
       { 
        for (int j = 0; j < 100000000; j++) ; 
        Console.WriteLine("Event "+i); 
       } 
       Console.WriteLine("Event finished"); 
      } 
     } 
    } 
} 
+0

有沒有什麼辦法可以在處理程序運行時停止Main()方法? – 2010-07-07 09:54:09

+0

編輯我的答案。 – 2010-07-07 09:54:48

+1

@Lasse - 糾正我,如果我錯了,但用這種方法不會最終出現競爭條件,這隻能工作,因爲處理程序搶在Main()之前的鎖?用Manual/AutoResetEvent你不會更好嗎? – slugster 2010-07-07 10:04:53