c#在功能完成时订阅事件?

c#在功能完成时订阅事件?,c#,events,C#,Events,如何更正添加onendad()的语法;进入乘法函数,使其仅在函数完成后进行回调?我尝试在return语句之后添加它,但显然不起作用,似乎无法找到其他方法…一旦乘法函数返回,控件将从发布服务器移开,因此这里需要进行一些设计更改 您的意思可能是在乘法运算完成时(不一定是整个函数调用),下面的更改就足够了 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.

如何更正添加onendad()的语法;进入乘法函数,使其仅在函数完成后进行回调?我尝试在return语句之后添加它,但显然不起作用,似乎无法找到其他方法…

一旦乘法函数返回,控件将从发布服务器移开,因此这里需要进行一些设计更改

您的意思可能是在乘法运算完成时(不一定是整个函数调用),下面的更改就足够了

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!");
            }
        }
    }
}
一种更好的(tm)方法是创建另一个名为
OperationScope
的类,类型为
IDisposable
,它为您调用onBeginAddd/OnEndAdd,例如:

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

注意:可能还有其他类似的方法来代替IDisposable类,例如将执行实际工作(乘法)的
Func
传递给另一个调用
OnBeginAdd
/
onendad
的方法

使用变量来存储结果==>引发事件==>返回变量。我希望在输出结果后进行回调。通过一些巧妙的思考,您可以找到调用某个方法的所有位置,并插入调用OnEndAdd事件的指令。但它不会很漂亮。
        public float Multiply(float a, float b)
        {
            using (new OperationScope(this)) //This is IDisposable and calls OnBeginAdd & OnEndAdd
            { 
                return a * b;
            }
        }