Jak połączyć Eventy i metody asynchroniczne?

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.

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?

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 :)

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