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!");
}
}
}
}
如何更正添加OnEndAdd()的语法?到Multiply函数中,以便仅在函数完成后才进行回调?我试过在return语句后添加它,但这显然行不通,似乎无法找出另一种方式...
答案 0 :(得分:2)
一旦Multiply函数返回了控件,控件就会从发布者那里移开,因此这里需要进行一些设计更改。
您可能是说on completion of the multiply operation
(不一定是整个函数调用),下面的更改就足够了。
public float Multiply(float a, float b)
{
OnBeginAdd();
var result = a * b;
OnEndAdd();
}
更漂亮(tm)的方法可能是创建另一个类,例如类型为OperationScope
的{{1}},它会为您调用OnBeginAdd / OnEndAdd-例如:
IDisposable
注意:除了使用IDisposable类以外,还有其他类似的方法,例如将执行实际工作的 public float Multiply(float a, float b)
{
using (new OperationScope(this)) //This is IDisposable and calls OnBeginAdd & OnEndAdd
{
return a * b;
}
}
传递给另一个调用{{1 }} / Func<xyz>
。