C# 如何访问计时器所连接的对象?
我有一个编程问题,我认为这是由于我在使用事件和委托时的粗糙性造成的 我有密码:C# 如何访问计时器所连接的对象?,c#,event-handling,C#,Event Handling,我有一个编程问题,我认为这是由于我在使用事件和委托时的粗糙性造成的 我有密码: public void DoStuff() { List<IProcess> processorsForService1 = processorsForService1 = ProcessFactory.GetProcessors(); foreach (IProcess p in processorsForService1)
public void DoStuff()
{
List<IProcess> processorsForService1 = processorsForService1 = ProcessFactory.GetProcessors();
foreach (IProcess p in processorsForService1)
{
if (p.ProcessTimer != null)
{
p.ProcessTimer.Elapsed += new ElapsedEventHandler(IProcess_Timer_Elapsed);
}
}
}
但是当我到达事件处理程序时,我在第一行得到p的null引用异常
如何在此实例中向处理程序传递参数?看起来您使用的是,如果要使用,则可以传递一个
状态
对象,在本例中,该对象可能是类的所需实例,即计时器的“所有者”。通过这种方式,您可以像以前在事件处理程序中实现的经验一样定义方法体,只是现在签名如下所示:
private void MyTimerCallbackMethod(object state)
{
}
然后,在创建计时器实例时,可以执行以下操作:
var timerCallback = new TimerCallback(MyTimerCallback);
var timer = new Timer(timerCallback, myStateObject,
Timeout.Infinite, Timeout.Infinite);
然后,使用
timer.Change(whenToStart,interval)
启动计时器。看起来您正在使用,如果要使用,则可以传递一个状态
对象,在本例中,该对象可能是类的所需实例,即计时器的“所有者”。通过这种方式,您可以像以前在事件处理程序中实现的经验一样定义方法体,只是现在签名如下所示:
private void MyTimerCallbackMethod(object state)
{
}
然后,在创建计时器实例时,可以执行以下操作:
var timerCallback = new TimerCallback(MyTimerCallback);
var timer = new Timer(timerCallback, myStateObject,
Timeout.Infinite, Timeout.Infinite);
然后,使用
timer.Change(whentstart,interval)
启动计时器。发送方是计时器对象,而不是与处理委托关联的对象。首先,事件可以有多个处理程序
您可以使用变量捕获创建一个可以访问
i进程的委托。发送方是计时器对象,而不是与处理委托关联的对象。首先,事件可以有多个处理程序
您可以使用变量捕获创建一个可以访问i进程的委托。如果使用lambda而不是委托,您可以从lambda引用类,因为它仍然在引用环境中。我想这就是所谓的
public void DoStuff()
{
List processorsForService1=ProcessFactory.GetProcessors();
foreach(ProcessorsForService 1中的IProcess p)
{
if(p.ProcessTimer!=null)
{
p、 ProcessTimer.Appead+=(s,e)=>
{
p、 第一步();
p、 步骤二();
};
}
}
}
但请注意以下与范围相关的规则(摘自):
以下规则适用于lambda表达式中的变量范围:
- 捕获的变量在引用它的委托超出范围之前不会被垃圾收集
- lambda表达式中引入的变量在外部方法中不可见
- lambda表达式无法直接从封闭方法捕获ref或out参数
- lambda表达式中的return语句不会导致封闭方法返回
- lambda表达式不能包含目标位于包含的匿名函数体外部或体内的goto语句、break语句或continue语句
如果使用lambda而不是委托,则可以从lambda中引用该类,因为它仍将位于引用环境中。我想这就是所谓的
public void DoStuff()
{
List processorsForService1=ProcessFactory.GetProcessors();
foreach(ProcessorsForService 1中的IProcess p)
{
if(p.ProcessTimer!=null)
{
p、 ProcessTimer.Appead+=(s,e)=>
{
p、 第一步();
p、 步骤二();
};
}
}
}
但请注意以下与范围相关的规则(摘自):
以下规则适用于lambda表达式中的变量范围:
- 捕获的变量在引用它的委托超出范围之前不会被垃圾收集
- lambda表达式中引入的变量在外部方法中不可见
- lambda表达式无法直接从封闭方法捕获ref或out参数
- lambda表达式中的return语句不会导致封闭方法返回
- lambda表达式不能包含目标位于包含的匿名函数体外部或体内的goto语句、break语句或continue语句
使事件处理程序成为IPProcess的成员,并按如下方式设置:
p.ProcessTimer.Elapsed += new ElapsedEventHandler(p.IProcess_Timer_Elapsed);
如果要在别处处理该事件,请让处理程序转发该事件:
class IProcess
{
public delegate void Timer_Elapsed_Handler (IProcess process, ElapsedEventArgs e);
public event Timer_Elapsed_Handler Timer_Elapsed;
public void IProcess_Timer_Elapsed (object sender, ElapsedEventArgs e)
{
if (Timer_Elapsed != null) Timer_Elapsed (this, e);
}
}
使事件处理程序成为IPProcess的成员,并按如下方式设置:
p.ProcessTimer.Elapsed += new ElapsedEventHandler(p.IProcess_Timer_Elapsed);
如果要在别处处理该事件,请让处理程序转发该事件:
class IProcess
{
public delegate void Timer_Elapsed_Handler (IProcess process, ElapsedEventArgs e);
public event Timer_Elapsed_Handler Timer_Elapsed;
public void IProcess_Timer_Elapsed (object sender, ElapsedEventArgs e)
{
if (Timer_Elapsed != null) Timer_Elapsed (this, e);
}
}
这样不行。对象不知道它属于哪个类。发送方是计时器
,而不是I进程
,因此如何将p传递给事件处理程序?我需要每5000毫秒在每个IProcess类中调用一个东西。为什么每个进程不能监听自己的计时器呢?我基本上如何向处理程序发送参数?@OskarKjellin,你应该添加该注释作为答案。这样不行。对象不知道它属于哪个类。发送方是计时器
,而不是I进程
,因此如何将p传递给事件处理程序?我需要每5000毫秒在每个IProcess类中调用一个东西。为什么每个进程不能监听它自己的计时器呢?我基本上如何向处理程序发送一个参数?@OskarKjellin,你应该添加这个注释作为答案。