委托调用的问题

q_forest 2012-04-17 04:32:46
问一个委托的问题
我在一个类里面声明的一个TimerCallback委托变量,然后把他传给一个计时器,如下:
public class SystemPowerManager
{
private Timer tmrGetPowerStatus;

private SYSTEM_POWER_STATUS_EX2 powStatus;

public TimerCallback GetPowerStatusCallback;

public SystemPowerManager()
{
GetPowerStatusCallback = GetSystemPowerStatus;
tmrGetPowerStatus = new Timer(GetPowerStatusCallback, powStatus, 0, 2000);
}

private void GetSystemPowerStatus(object status)
{
NativeMethods.GetSystemPowerStatusEx2(ref powStatus, (uint)Marshal.SizeOf(powStatus), false);
}
}

在构造函数里面给委托赋值,然后实例化timer,每隔两秒执行委托.

然后我再一个窗口的Form_Load里面给这个委托添加一个注册方法:
powerManager.GetPowerStatusCallback += headbar.GetBatteryStatusCallback;
GetBatteryStatusCallback是HeadBar类的一个方法.
运行时每次可以调用PowerManager类的GetSystemPowerStatus方法,但是后来注册的方法总是不被执行,这是怎么回事??
...全文
132 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
q_forest 2012-04-17
  • 打赏
  • 举报
回复
多谢pptra了,我在计时器实例化之前注册所有的方法就没问题了,我感觉这个地方不太符合事件的概念,谢谢你的回复
timTrubo 2012-04-17
  • 打赏
  • 举报
回复

public class A
{
public EventHandler myEvent;
public A()
{
this.myEvent += MyMethod;
}

public void MyMethod(object sender, EventArgs e)
{
Console.WriteLine("A::MyMethod");
}

public void Run()
{
if (this.myEvent != null)
{
myEvent(this, null);
}
}
}

public class B
{
public B()
{
}

public void MyMethod(object sender, EventArgs e)
{
Console.WriteLine("B::MyMethod");
}
}


A a = new A();
B b = new B();
a.myEvent += b.MyMethod;
a.Run();
q_forest 2012-04-17
  • 打赏
  • 举报
回复
难道在SystemPowerManager类外面添加注册方法不行吗?额,我试过在SystemPowerManager类的够构造方法里给GetPowerStatusCallback委托添加一个本类的方法注册,结果是可以调用两个方法.

public SystemPowerManager()
{
GetPowerStatusCallback = GetSystemPowerStatus;
GetPowerStatusCallback += TimerCallbackTest;
tmrGetPowerStatus = new Timer(GetPowerStatusCallback, powStatus, 0, 2000);
}

private void TimerCallbackTest(object status)
{
System.Threading.Thread.Sleep(1000);
}
q_forest 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

public SystemPowerManager()
{
GetPowerStatusCallback = GetSystemPowerStatus; <===== ?????
tmrGetPowerStatus = new Timer(GetPowerStatusCallback, powStatus, 0……
[/Quote]
GetPowerStatusCallback = GetSystemPowerStatus;//初始化委托变量,并注册一个方法

powerManager.GetPowerStatusCallback += headbar.GetBatteryStatusCallback
在别的地方添加一个powerManager的GetPowerStatusCallback委托的方法注册
timTrubo 2012-04-17
  • 打赏
  • 举报
回复
public SystemPowerManager()
{
GetPowerStatusCallback = GetSystemPowerStatus; <===== ?????
tmrGetPowerStatus = new Timer(GetPowerStatusCallback, powStatus, 0, 2000);
}

powerManager.GetPowerStatusCallback += headbar.GetBatteryStatusCallback <==== ????;

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧