2010-05-02 84 views
2

我正在嘗試在JScript.NET中使用BeginRead()執行異步IO,但無法使回調函數正常工作。強制轉換委託類型在JScript.NET中失敗

下面是代碼:

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和委託類型沒有無濟於事。

代表都應該是自動生成,避免需要明確地創建一個新的AsyncCallback,如:

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

而事實上,如果你嘗試創建委託明確,編譯器會發出錯誤。我必須在這裏錯過一些東西。

回答

2

問題使用

Delegate.CreateDelegate(Type, Object, String) 

其中Type是委託類型創建內部委託創建基於這樣的事實,對象是在其上的方法將被調用的實例和字符串的名稱是方法。爲了使這項工作,該函數必須是實例方法,所以我們必須定義一個類,如:

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的一個實例,轉換就會成功。上面列出的錯誤很可能是我嘗試進行明確投射的一種嘗試,而這不是在轉換過程中發生的。

相關問題