Переполняется стек. c#. Задание с событиями(event) Ping pong

520
13 апреля 2018, 14:47

Есть два класса, у каждого свой метод для вывода информации, в обеих вызывается метод который связан на метод другого класса.

Вопрос в том, как убрать переполнение стека.

Задание 6.20 Лабораторная работа. Делегаты

Задания

  1. Напишите "пинг-понг":

• 2 класса Ping и Pong

• один уведомляет другого, о том, что "произошёл пинг", другой - о том, что "произошёл понг",

• одна пара объектов "играют" между собой, другая пара - между собой и т.д.

и выводить на консоль соответсвующие сообщения, что-то вроди такого:

  1. Ping received Pong.
  2. Pong received Ping.
  3. Ping received Pong.
  4. Pong received Ping.
  5. Ping received Pong.

    class Program
    {
        class Pong
        {
            public delegate void Ud();
            public event Ud Vivod;
            public void Udar()
            {
                Console.WriteLine("Понг отбил пинг");
                if (Vivod != null)
                    Vivod();
            }
        }
        class Ping
        {
            public delegate void Ud();
            public event Ud Vivod;
            public void Udar()
            {
                Console.WriteLine("Пинг отбил понг");
                if (Vivod != null) 
                Vivod();
            }
        }
        static void Main(string[] args)
        {
            Ping ping = new Ping();
            Pong pong = new Pong();
            Ping.Ud v = pong.Udar;
            Pong.Ud vi = ping.Udar;
            ping.Vivod += v;
            pong.Vivod += vi;
            ping.Udar();
        }
    }
Answer 1

Что-то такое получилось

class PingPong
{
    private readonly string _nameMe;
    private readonly string _nameOpponent;
    public PingPong(string nameMe, string nameOpponent)
    {
        _nameMe = nameMe;
        _nameOpponent = nameOpponent;
    }
    public delegate void KnockHandler();
    public event KnockHandler Knock;
    public void KnockHandlerInstance()
    {
        Console.WriteLine($"{_nameMe} received {_nameOpponent}");
    }
    public void RaiseKnock()
    {
        Knock?.Invoke();
    }
}
class PingPongFactory
{
    private void RunPingPong(PingPong ping, PingPong pong)
    {
        while (true)
        {
            ping.RaiseKnock();
            Task.Delay(TimeSpan.FromSeconds(1)).Wait();
            pong.RaiseKnock();
            Task.Delay(TimeSpan.FromSeconds(1)).Wait();
        }
    }
    public Task LaunchPair(int id)
    {
        var pingName = $"Ping{id}";
        var pongName = $"Pong{id}";
        PingPong ping = new PingPong(pingName, pongName);
        PingPong pong = new PingPong(pongName, pingName);
        ping.Knock += pong.KnockHandlerInstance;
        pong.Knock += ping.KnockHandlerInstance;
        Task result = new Task(() => RunPingPong(ping, pong));
        return result;
    }
}
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("==ConsoleAppPingPong==");
        Console.WriteLine("Для начала нажмите Ввод");
        Console.ReadLine();
        PingPongFactory factory = new PingPongFactory();
        Task task1 = factory.LaunchPair(1);
        task1.Start();
        Task task2 = factory.LaunchPair(2);
        task2.Start();
        task1.Wait();
        task2.Wait();
        Console.ReadLine();
    }
}
READ ALSO
Как заполнить таблицу с помощью ajax?

Как заполнить таблицу с помощью ajax?

Здравствуйте! Использую DataTables и ajax-запросом хочу отобразить таблицу, передав данные в json

319
c# Долгий поиск dll

c# Долгий поиск dll

Есть приложение на c#, использующее ссылку на библиотеку microsoftinterop

198
Запуск программы через раз

Запуск программы через раз

Всем привет, сделал приложение Windows Form на с#При запуске программа должна автоматически загружаться пр входе пользователя в систему

269
Что лучше использовать IComparer или IComparable?

Что лучше использовать IComparer или IComparable?

Что лучше использовать для сортировки IComparer или IComparable?Можете сказать что из них лучше использовать и почему? Лично я сам не совсем понял что...

281