2010-05-02 2 views
2

JScript.NET에서 BeginRead()를 사용하여 비동기 IO를 수행하려고하는데 콜백 함수가 제대로 작동하지 않습니다. I no로 MulticastDelegate 및 위임 유형 AsyncCallback과베이스에 모두 명시 적 캐스트를하고 시도JScript.NET에서 대리자 형식으로 캐스트가 실패 함

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[]) 

:

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():'); 
} 

예외는 캐스트 실패는 : 여기

코드입니다 이익.

대표는 예를 들어, 명시 적으로 새로운 AsyncCallback를 만들기위한 필요성을 제거, 자동으로 생성 해야하는 :

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

그리고 당신이 대리자를 만들려고하면 사실

명시 적으로 컴파일러가 오류를 발행합니다. 여기에 뭔가 빠져 있어야합니다.

답변

2

이 문제는 유형 만들 수있는 대리자 형식이

Delegate.CreateDelegate(Type, Object, String) 

를 사용하여 내부 대리자가 생성된다는 사실에서 비롯, 객체 메소드 호출의 대상이되는 인스턴스이며, 문자열의 이름입니다 방법. 이 작업을하기 위해서는, 함수는 인스턴스 메서드 여야합니다, 그래서 우리는 같은 클래스를 정의해야합니다

콜백은 이제 런타임시 AsyncFileReader의 인스턴스에 바인딩 할 수 있기 때문에
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 

, 변환이 성공합니다. 위에 열거 된 오류는 명시 적으로 캐스팅 할 때의 시도 중 하나 일 가능성이 높습니다. 여기서는 변환 중에 발생하는 오류가 아닙니다.

관련 문제