Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何访问计时器所连接的对象?_C#_Event Handling - Fatal编程技术网

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,你应该添加这个注释作为答案。