Jak połączyć Eventy i metody asynchroniczne?

Odpowiedz Nowy wątek
2017-11-14 18:30
Uczynny Młot
0

Hej.

Mam mniej więcej taką klasę:

internal sealed class SomethingDoing
    {
        #region Constructors
        internal SomethingDoing()
        {
            result = null;
        }
        #endregion
 
        #region Events
        internal event Action OnStart;
        internal event Action OnWorking;
        internal event Action OnEnd;
        #endregion
 
        #region Methods
        internal async Task DoSomethingAsync()
        {
            await Task.Factory.StartNew(() =>
            {
                OnStart();
 
                try
                {
                    OnWorking();
                }
                catch
                {
                    throw;
                }
 
                OnEnd();
            });
        }
        #endregion
 
        #region Properties
        internal dynamic Result => result;
        #endregion
 
        #region Variables
        private dynamic result;
        #endregion
    }

Odkryłem, że nie mogę w ten sposób używać zdarzeń. Jak estetycznie i poprawnie to obejść? Leżę w tej materii.

edytowany 1x, ostatnio: furious programming, 2017-11-14 19:33

Pozostało 580 znaków

2017-11-14 20:29
0

Po pierwsze zdarzenia są typu EventHandler, a nie Action, owszem taki kod jak masz przejdzie, bo nikt tego nie zabrania, ale metoda obsługi zdarzenia powinna przyjmować dwa parametry:

  • sender - czyli obiekt, który wywołał zdarzenie
  • eventArgs - obiekt udostępniający informacje związane ze zdarzeniem

Po drugie zdarzeń nie nazywasz zaczynając od: "On...", tylko normalnie np. ValueChanged.

Po trzecie w klasie gdzie masz te zdarzenie definiujesz metodę właśnie z tym "On...", żeby móc wywołać te zdarzenie. Struktura tej metody jest następująca:

    protected virtual void OnValueChanged(EventArgs e)
        {
            if (ValueChanged != null)
            {
                ValueChanged(this, e);
            }
        }

Dzięki temu program się nie sypnie jak nie będziesz miał żadnych subskrypcji. No w tym przypadku co Ty masz Twoja klasa jest ostateczna więc protected virtual trzeba by było wywalić.

A z tą asynchronicznością to nie wiem o co Ci chodzi, że Ci to nie działa czy jak? Co byś chciał uzyskać tym kodem?

edytowany 1x, ostatnio: Manuel.Artificer, 2017-11-14 20:32

Pozostało 580 znaków

2017-11-14 21:14
Uczynny Młot
0

Dzięki za odpowiedź. Bardzo wartościowa.

Po wywołaniu metody DoSomethingAsync wyrzucało System.Reflection.TargetInvocationException. Wywnioskowałem, że nie można podnosić zdarzeń bezpośrednio w zadaniu, jednak okazało się, że nie rozumiem zdarzeń.
Za dużo praktyki a za mało teorii.

A co do typu zdarzeń: nie potrzebuję takiej informacji zwrotnej jak źródło i inne, więc nie chce zaśmiecać.

Wszystko już działa.
Dzięki za pomoc :)

No to w takim razie to nie są zdarzenia. Zdarzenie musi mieć taką strukturę. Tak jest przyjęte i tam ma być. W polu możesz też mieć zapisaną samą delegatę więc wywal event i zostaw typ i nazwę. - Manuel.Artificer 2017-11-14 22:08

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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