c# - c#在函数完成时订阅事件?
问题描述
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() 的语法;进入乘法函数,使其仅在函数完成后回调?我已经尝试在 return 语句之后添加它,但这显然不起作用,似乎无法找到另一种方式......
解决方案
一旦 Multiply 函数返回,控件就会离开发布者,因此这里需要进行一些设计更改。
您是否可能的意思是on completion of the multiply operation
(不一定是整个函数调用),以下更改就足够了。
public float Multiply(float a, float b)
{
OnBeginAdd();
var result = a * b;
OnEndAdd();
}
更漂亮的(tm)方法可能是创建另一个名为 egOperationScope
的类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>
执行实际工作(乘法)的 a 传递给另一个调用OnBeginAdd
/的方法OnEndAdd
。
推荐阅读
- vba - 在 MS-Access 表单中显示当前记录
- xamarin.android - iOS中“OnUserInteraction”的等价物是什么
- postgresql - 如何在 Postgresql 中将参数上下文从超级用户更改为用户?
- html - NSAttributedString 忽略 html 标签内的属性
- json - jq fromdate "不匹配格式 "%Y-%m-%dT%H:%M:%SZ"
- r - R:几个向量之间的所有交集
- azure - 将现有 Azure 混合连接中继导出到 ARM 模板
- html - nodemailer-express-handlebars | 错误:ENOENT:模板没有这样的文件或目录!节点.js
- laravel - 如何将下拉列表应用于给定的列范围或整个列 Laravel excel
- android - 加密包问题数据必须是使用加密的字符串或缓冲区