Hej :)
Jestem w trakcie tworzenia dość dużego systemu, i nadszedł czas na refaktoryzację części kodu. Już tłumaczę o co chodzi , i w czym problem.
Sama logika działania aplikacji jest dość dobrze zaprojektowana ale, żeby poprawnie mogła ona działać musi potrafić komunikować się z zewnętrznym systemem. Na wstępie muszę dodać, że nie było możliwości skorzystania z popularnego WCFa :- )
Komunikacja, odbiór oraz nadawanie wiadomości są już oprogramowana więc tą część kodu można spokojnie użyć ponownie.
A teraz do sedna, i problemu : W tej chwili pobieranie, oraz kolejkowanie wiadomości odbywa się w komponencie timer’a który po wyznaczonym odstępie czasu, sprawdza czy są dostępne nowe wiadomości. Wszystko przedstawiono na uproszczonym przykładzie poniżej ( wyczyściłem locki, konstruktory, wszystko co mogłoby zaciemniać przykład ).
class MQueue
{
private readonly Queue<string> queue = new Queue<string>();
public event EventHandler NewMassagesEvent;
private Timer aTimer;
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
if ( System.IsNewMessage )
{
Enqueue(System.GetMessage());
OnChanged();
}
}
protected void OnChanged()
{
if (NewMassagesArrived != null)
NewMassagesArrived(this, EventArgs.Empty);
}
public void Enqueue(string item)
{
queue.Enqueue(item);
}
public string Dequeue()
{
return queue.Dequeue();
}
}
Po otrzymaniu wiadomości, dodawana jest ona co prawda do kolejki ale event nowego polecenia jest rzucany w BARDZO brzydki sposób. W argumencie przesyłany jest cały obiekt klasy, po to, żeby listener mógł pobrać rozkaz za pomocą metody Dequeue. Dodatkowo w takim przypadku obsługa delegatów odbywa się w wątku timera, a nie w wątku głównym.
Może ktoś mnie nakierować ? W jaki sposób zrefaktoryzować w/w klasę aby działała jak trzeba ?
Dzięki za wszelką pomoc!