您如何制作一个事件驱动的程序,只要引发和处理事件,主流程的执行就会暂停,直到事件处理程序完成?
我创建了以下程序
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 秒触发一个事件。在事件处理过程中,程序应该打印“Event started”、“Event 1”到“Event 5”,然后是“Event Finished”,然后返回。
我希望 Main() 流程在调用 TimerHandler() 时停止,但是我的输出表明 Main() 和 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
是否可以让 Main() 方法在处理事件时停止?
最佳答案
您正在使用 System.Timers.Timer ,它在后台线程上处理滴答声,通常使用线程池。
因此,是的,它将与您的其余主代码同时运行。
关于你的第二个问题,可能让 Main 停止,我需要知道预期的行为是什么。
如果您希望 TimerHandler 中的整个 tick 一起运行,同时暂停 Main,一个简单的锁就足够了:
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");
}
}
}
}
关于c# - 如何在 C#.NET 中进行事件驱动编程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3193628/