none
在静态函数中,如何触发自定义事件? RRS feed

  • 问题

  • 我正在研究异步HTTP下载的程序,看了MSDN的例子,感觉不算难,就是调用:
    BeginGetResponse、BeginRead

    然后提供一个回调函数:

    private static  void ReadCallBack(IAsyncResult asyncResult)


    但是我希望能够做成在ReadCallBack函数中,每次读取完成就触发一个自定义事件,此事件能够通知主窗体去更新进度条。

    自定义事件已经写好,但是我却发现由于ReadCallBack是静态函数,所以根本就不能调用触发事件的程序。

    我尝试过将事件的函数声明为静态,再把“virtual”关键字去掉,虽然通过编译但是运行出错。所以求高人指点。


    da jia hao!
    2010年3月18日 16:41

答案

  • 请教,我按照指示将callback的“static”关键字去掉,编译的时候就报错:

     

    错误 CS0120: 非静态的字段、方法或属性“LiuBinHttpTool.HttpTool.ReadCallBack(System.IAsyncResult)”要求对象引用

     

    看了下代码,不是callback函数的问题,而是在调用callback函数的地方有错:

    IAsyncResult asynchronousInputRead = responseStream.BeginRead(state.buffer, 0, 4096, new AsyncCallback(ReadCallBack), state);
    具体是这里:new AsyncCallback(ReadCallBack)
    请问这里应该怎么写才对?


    IAsyncResult asynchronousInputRead = responseStream.BeginRead(state.buffer, 0, 4096, this.ReadCallBack, state);

    静态callback也没问题,你可以把UI更新事件作为 state 对象的属性嘛。

    2011年6月8日 9:30

全部回复

  • 在 .Net 下面,CallBack 不一定必须是 static ,可以是成员函数。

     

    虽然不知道是怎么实现的,但是的确可以这样做

    2010年3月19日 2:56
  • 你好!

         ReadCallBack可以定义成非静态的,或是把事件定义成静态的!


    周雪峰
    • 已标记为答案 YiChun Chen 2010年3月22日 11:38
    • 取消答案标记 liubin 2011年5月24日 16:21
    2010年3月19日 6:45
    版主
  • 请教,我按照指示将callback的“static”关键字去掉,编译的时候就报错:

     

    错误 CS0120: 非静态的字段、方法或属性“LiuBinHttpTool.HttpTool.ReadCallBack(System.IAsyncResult)”要求对象引用

     

    看了下代码,不是callback函数的问题,而是在调用callback函数的地方有错:

    IAsyncResult asynchronousInputRead = responseStream.BeginRead(state.buffer, 0, 4096, new AsyncCallback(ReadCallBack), state);
    具体是这里:new AsyncCallback(ReadCallBack)
    请问这里应该怎么写才对?

    2011年5月24日 16:22
  • 不是静态类中声明静态事件,如处理不当,会出现事件被重复注册的情况。即触发一次事件,注册方法被多次调用。

    慎用。


    QQ: 79965521 Email: WolfLai@126.com
    2011年6月8日 9:21
  • 请教,我按照指示将callback的“static”关键字去掉,编译的时候就报错:

     

    错误 CS0120: 非静态的字段、方法或属性“LiuBinHttpTool.HttpTool.ReadCallBack(System.IAsyncResult)”要求对象引用

     

    看了下代码,不是callback函数的问题,而是在调用callback函数的地方有错:

    IAsyncResult asynchronousInputRead = responseStream.BeginRead(state.buffer, 0, 4096, new AsyncCallback(ReadCallBack), state);
    具体是这里:new AsyncCallback(ReadCallBack)
    请问这里应该怎么写才对?


    IAsyncResult asynchronousInputRead = responseStream.BeginRead(state.buffer, 0, 4096, this.ReadCallBack, state);

    静态callback也没问题,你可以把UI更新事件作为 state 对象的属性嘛。

    2011年6月8日 9:30