【问题标题】:Cast to delegate type fails in JScript.NET在 JScript.NET 中转换为委托类型失败
【发布时间】:2010-05-02 02:00:53
【问题描述】:

我正在尝试在 JScript.NET 中使用 BeginRead() 进行异步 IO,但我无法让回调函数正常工作。

代码如下:

function readFileAsync() {
    var fs : FileStream = new FileStream( 'test.txt', FileMode.Open, FileAccess.Read );
    var result : IAsyncResult = fs.BeginRead( new byte[8], 0, 8, readFileCallback ), fs );
    Thread.Sleep( Timeout.Infinite );
}

var readFileCallback = function( result : IAsyncResult ) : void {
 print( 'ListenerCallback():' );
}

异常是强制转换失败:

Unhandled Exception: System.InvalidCastException: Unable to cast object of type 'Microsoft.JScript.Closure' to type 'System.AsyncCallback'.
at JScript 0.readFileAsync(Object this, VsaEngine vsa Engine)
at JScript 0.Global Code()
at JScript Main.Main(String[] )

我尝试对 AsyncCallback 和基本 MulticastDelegate 和 Delegate 类型进行显式转换,但无济于事。

委托应该是自动创建的,无需显式创建新的 AsyncCallback,例如:

BeginRead( ... new AsyncDelegate( readFileCallback), object );

事实上,如果您尝试显式创建委托,编译器会发出错误。我一定在这里遗漏了什么。

【问题讨论】:

    标签: .net jscript.net


    【解决方案1】:

    问题源于内部委托是使用

    创建的这一事实
    Delegate.CreateDelegate( Type, Object, String ) 
    

    其中 Type 是要创建的委托类型,Object 是调用方法的实例,String 是方法的名称。为了让它工作,函数必须是一个实例方法,所以我们必须这样定义一个类:

    class AsyncFileReader 
    {
        function readFileAsync() {
            var fs : FileStream = new FileStream( 
                'test.txt', FileMode.Open, FileAccess.Read 
            );
    
            var result : IAsyncResult = fs.BeginRead( 
                new byte[8], 0, 8, ListenerCallback, fs 
            );
            // Sleep just for testing
            Thread.Sleep( Timeout.Infinite );
        }
    
        function ListenerCallback( result : IAsyncResult ) : void {
            print( 'ListenerCallback():' );
        }
    
    } // class
    

    由于回调现在可以在运行时绑定到 AsyncFileReader 的实例,因此转换将成功。上面列出的错误很可能是我显式转换的尝试之一,这不是此处转换期间发生的情况。

    【讨论】:

      猜你喜欢
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      • 1970-01-01
      相关资源
      最近更新 更多