c# - 如何在 C#.NET 中进行事件驱动编程?

标签 c# .net events timer

您如何制作一个事件驱动的程序,只要引发和处理事件,主流程的执行就会暂停,直到事件处理程序完成?

我创建了以下程序

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/

相关文章:

javascript - PageMethods 未定义,添加静态会破坏它

c# - 从表达式函数获取属性

c# - 将下一个参数作为 String.Format 中的字段宽度

c# - 如何在 C# 程序中生成一组随机字符串,以便不轻易预测它们?

javascript - 如何在此 Pixel Art Maker 的 Javascript 中修复此颜色事件功能?

C# - 加载表单后是否会立即触发任何事件?

c# - 如何在 C# 中等待单个事件,超时和取消

.net - NETCore1.1中如何设置AssemblyTitleAttribute

.net - 使用 ViewModel 进行 UI 线程化

javascript - event.target/srcElement 在 Chrome 和 Opera 中不能 100% 工作