Как сделать событийное программирование в C # .NET? - PullRequest
3 голосов
/ 07 июля 2010

Как создать управляемую событиями программу, в которой выполнение основного потока приостанавливается всякий раз, когда событие вызывается и обрабатывается, пока не завершится обработчик события?

Я создал следующую программу

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 () вызывается, однако мой вывод показывает, что 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 () останавливаться во время обработки события?

1 Ответ

3 голосов
/ 07 июля 2010

Вы используете System.Timers.Timer , который обрабатывает тики в фоновом потоке, обычно используя пул потоков.

Таким образом, да, он будет работать одновременно сОстальная часть вашего основного кода.

Что касается вашего второго вопроса, возможно ли остановить Main, мне нужно знать, каково ожидаемое поведение.

Если вы хотите, чтобы в TimerHandler был полный тикработать вместе, останавливая 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");
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...