Wywołanie metody w singletonie

0

Dzień dobry,

Otóż, mam klasę Singleton(jest ona oczywiście singletonem), a w niej metodę z nieskończoną pętlą while i drugą metodę, która coś zwraca(GetKey()). Pętla while jest "sercem" tego programu; to ona wydaje polecenia (przerwanie jej oznacza zakończenie programu). Gdy próbuję wywołać metodę GetKey() z innej klasy:

ConsoleKeyInfo key = Singleton.Instance.GetKey();

Program wraca od razu do pętli głównej, gdyż tam była ostatnio wykonana akcja nie wywołując przy tym metody GetKey(). <--- przynajmniej tak mi się wydaje
Pytaniem jest jak mogę się dobrać do metody GetKey() z poza tego Singletonu.
Jeśli byłby potrzebny kod to doślę, ale mam nadzieję, że dobrze zilustrowałem problem.

pozdrawiam

0

Aby ułatwić wyciąłem odpowiedni fragment kodu.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Singleton
    {
        static Singleton instance;
        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                    instance = new Singleton();

                return instance;
            }
        }

        Hero hero;
        ConsoleKeyInfo key;

        private Singleton()
        {
            hero = new Hero();
            Start();
        }

        private void Start()
        {
            while (true)
            {
                if (Console.KeyAvailable)
                    key = Console.ReadKey();
                hero.DownloadKey();
            }
        }

        public ConsoleKeyInfo GetKey()
        {
            return key;
        }


    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Hero
    {
        public void DownloadKey()
        {
            ConsoleKeyInfo key = Singleton.Instance.GetKey();
            Move(key);
        }

        public void Move(ConsoleKeyInfo key)
        {
            //ciało
        }
    }
}```
0

w konstruktorze wchodzisz w nieskończoną pętlę więc instance cały czas jest null, i Singleton.Instance.GetKey(); kolejny raz wywołuje konstruktor

0

Ok, czyli metodę Start nie powinienem wywoływać w konstruktorze tylko w pierwotnej klasie program?

Singleton singleton = Singleton.Instance;
singleton.Start();

Ale załóżmy, że chciałbym aby metoda Start była prywatna i mogła być wywołana tylko z wnętrza klasy Singleton. Na dodatek, aby mogła być wywołana tylko raz. Konstruktor Singletonu wydawał się do tego idealny. Jak mógłbym ten problem obejść, ale tak aby warunki które podałem wyżej zostały spełnione? Nie mam pomysłu jak to zrobić.

0

Według mnie w ogóle ten pomysł jest dyskusyjny, ale może

        public static Singleton Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Singleton();
                    instance.Start();
                 }
 
                return instance;
            }
        }

0

Dzięki, teraz wszystko działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1