循环中的c#EventHandler不';t火
我仍然是一个处理事件的noob,使用eventhandler更新表单时遇到问题。 我有一个窗体,它是类StartPage中的一个计数器,这个计数器应该显示参数“bookQuantity”的值,该值是在另一个类调用的Gauge中计算的。我在while循环中订阅了eventHadler,但在调试过程中,似乎从未使用过函数Counter_Tick,它传递了CounterEvent,并且没有启动Counter_Tick函数。 下面是代码(简化):循环中的c#EventHandler不';t火,c#,.net,winforms,events,C#,.net,Winforms,Events,我仍然是一个处理事件的noob,使用eventhandler更新表单时遇到问题。 我有一个窗体,它是类StartPage中的一个计数器,这个计数器应该显示参数“bookQuantity”的值,该值是在另一个类调用的Gauge中计算的。我在while循环中订阅了eventHadler,但在调试过程中,似乎从未使用过函数Counter_Tick,它传递了CounterEvent,并且没有启动Counter_Tick函数。 下面是代码(简化): 由于缺乏可靠地再现问题的好方法,因此无法确定。但是在您发
由于缺乏可靠地再现问题的好方法,因此无法确定。但是在您发布的代码中,没有任何引发
CounterEvent
事件的代码。为什么您希望调用任何处理程序?代码还有其他问题,但我猜你没有费心去真正提出这个事件,这可以解释你看到了什么。FWIW:在循环中订阅事件而不取消订阅该事件不太可能产生您想要的效果;我们希望这只是一个错误的尝试来追踪这个问题。你的代码似乎离基础很远。我建议你问一个更一般的问题,在这个问题中,你描述了你试图实现的更高层次的目标。我怀疑上述情况是否接近一个真正好的解决方案。当然,我不能肯定,因为从你的问题来看,代码应该做什么还不是很清楚。我没有看到反事件曾经在哪里出现过。你是对的。这是一个微不足道的错误。
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace zeus
{
public class Gauge : IGauge
{
private IObjectsToPrint objectsToPrint = new ObjectsToPrint();
private IOutputMessages outputMessages = new OutputMessages();
private decimal bookQuantity;
private float counter = Parameters.GetcounterToPrint;
public EventArgs e = null;
public delegate void CounterHandler(Gauge g, EventArgs e);
private StartPage target;
private EventHandler CounterEvent;
public Gauge()
{
List<Books> ListToPrint = Parameters.GetList;
bookQuantity = Parameters.FirstQuantity;
}
private long theCounter;
public long TheCounter
{
get
{
return theCounter;
}
set
{
theCounter = value;
OnCounterChanged(this.theCounter);
}
}
public async void GaugeCalculator()
{
var ItemList = Parameters.GetList;
bookQuantity = Parameters.FirstQuantity;
Parameters._counterToPrint = (long)bookQuantity;
// CounterEvent += new EventHandler(Counter_Tick);
if (Parameters.Getgaugespeedvalue == 0)
{
//do nothing as we are not running
}
else
{
foreach (var elem in ItemList)
{
bookQuantity = Parameters.getQuantity(elem);
while (bookQuantity > 0)
{
await Task.Delay(TimeSpan.FromMilliseconds(20000 / (Parameters.Getgaugespeedvalue + 1)));
CounterEvent += new EventHandler(Counter_Tick);
bookQuantity--;
}
if (bookQuantity == 0)
outputMessages.PrintFinished(Parameters.getTitle(elem));
// MessageBox.Show("hello");
}
}
}
public delegate void CounterTickerHandler(long newCount);
public event CounterTickerHandler TheCounterChanged;
public void Counter_Tick(object sender, EventArgs e)
{
TheCounter = (long)bookQuantity;
}
protected void OnCounterChanged(long newCount)
{
if (TheCounterChanged != null)
{
TheCounterChanged(newCount);
}
}
}
}
namespace zeus
{
public partial class StartPage : zeus.ParentForm
{
public StartPage()
{
InitializeComponent();
this.gauge = new Gauge();
this.gauge.TheCounterChanged += new Gauge.CounterTickerHandler(CounterHasChanged);
}
}
}