【发布时间】:2017-01-16 13:57:01
【问题描述】:
我在调用将事件传递给特定类后添加的委托时遇到问题,我认为委托将更新作为对象..
例如,我将委托传递给的类:
更新代码(由于 cmets 中的一些问题)
这实际上是 +- 我需要如何运行它,“ExecutorOnCalculationCompleted”从不调用(请忽略睡眠和同步,我将代码缩小到所需部分)
class Executor
{
public delegate void CalculationCompletEventHandler(int score);
public event CalculationCompletEventHandler CalculationCompleted;
public void Start()
{
CalculationCompleted += OnCalculationCompleted;
Plus plus = new Plus(1, 2, CalculationCompleted);
Minus minus = new Minus(5, 2, CalculationCompleted);
Multi multi = new Multi(5, 2, CalculationCompleted);
...
... They will work async...
}
private void OnCalculationCompleted(int score)
{
Console.WriteLine("OnCalculationCompleted , score=" + score);
}
}
class Plus
{
private Executor.CalculationCompletEventHandler _calculationCompletEventHandler;
private int a;
private int b;
public Plus(int a, int b,Executor.CalculationCompletEventHandler calculationCompletEventHandler)
{
this.a = a;
this.b = b;
_calculationCompletEventHandler = calculationCompletEventHandler;
}
public void Calculate()
{
_calculationCompletEventHandler?.Invoke(a+b);
}
}
class Program
{
static void Main(string[] args)
{
Executor executor = new Executor();
executor.Start(); // async action
executor.CalculationCompleted += ExecutorOnCalculationCompleted;
...
}
// This method doesn't get invoked when the class inside Executor fire the event.
private static void ExecutorOnCalculationCompleted(int score)
{
Console.WriteLine("ExecutorOnCalculationCompleted , score=" + score);
}
}
【问题讨论】:
-
那是因为代表的引用不一样。
+=使用 Delegate.Combine 创建一个新委托 -
实际上事件必须在
Plus方法内,你为Subtract等编写相同的事件,委托必须在全局命名空间中,不要放在类中。Executor将其方法订阅到 Plus 和 Subtract 等各个事件 -
你到底想在这里做什么?你的目标是什么?为此,
Plus需要拥有该事件,但是添加一个Multiply类会发生什么? -
嗨@M.kazemAkhgary,我更新了我的代码希望这能澄清一些问题
-
请将其缩减为minimal reproducible example。目前还不足以实际运行代码,但您确实拥有比您需要的更多。
标签: c# events reference delegates invoke