C#如何在一个函数执行完毕后订阅一个事件?

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

namespace ConsoleApp13
{
    class Program
    {
        public class Subscriber
        {
            public static void Main()
            {
                Publisher publisher = new Publisher();


                publisher.BeginAdd += AddCallback;
                publisher.EndAdd += EndCallBack;

                Console.WriteLine(publisher.Multiply(2.3f, 4.5f));


                publisher.BeginAdd -= AddCallback;
                publisher.EndAdd -= EndCallBack;
                Console.WriteLine(publisher.Multiply(3.3f, 4.4f));

                Console.ReadLine();
            }
            public static void AddCallback(string message)
            {
                Console.WriteLine("Callback - " + message);
            }

            public static void EndCallBack(string message)
            {
                Console.WriteLine("Callback - " + message);
            }
        }
        public class Publisher
        {
            public delegate void Notify(string message); // Declare delegate.
            public event Notify BeginAdd;                // Declare event.
            public event Notify EndAdd;

            public float Multiply(float a, float b)
            {
                OnBeginAdd();                            // Raise event.
                OnEndAdd();
                return a * b;
            }
            private void OnBeginAdd()
            {
                if (BeginAdd != null)
                    BeginAdd("Starting multiplication!");      // Call callback method.
            }

            private void OnEndAdd()
            {
                if (EndAdd != null)
                    EndAdd("Completing multiplication!");
            }
        }
    }
}

我该如何更正向 Multiply 函数中添加 OnEndAdd() 的语法,以便它只在函数执行完成后回调?我尝试将其添加到 return 语句之后,但显然这不起作用,无法找到其他方法...


使用变量存储结果 ==> 触发事件 ==> 返回变量。 - skyoxZ
我希望回调在结果输出后执行。 - stephencurry30
通过一些巧妙的反射,你可以找到调用某个方法的所有位置,并注入一个调用 OnEndAdd 事件的指令。但这样做可能不太美观。 - Nikolaj Dam Larsen
1个回答

2

一旦 Multiply 函数返回控制权,发布者就会移动,因此这里需要进行一些设计更改。

您是否意味着在完成乘法操作后(而不是必要的整个函数调用),以下更改就足够了。

        public float Multiply(float a, float b)
        {
            OnBeginAdd(); 
            var result = a * b;
            OnEndAdd();
        }

更好的方法是创建另一个名为 OperationScope 的类,类型为 IDisposable ,它会自动调用 OnBeginAdd / OnEndAdd - 例如:

        public float Multiply(float a, float b)
        {
            using (new OperationScope(this)) //This is IDisposable and calls OnBeginAdd & OnEndAdd
            { 
                return a * b;
            }
        }
<注意:> 除了使用一个IDisposable类之外,还有其他可能的类似方法,比如将执行实际工作(乘法)的Func<xyz>传递给另一个调用OnBeginAdd/OnEndAdd的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接