我有一个“for”循环,它必须转换数千个彼此不依赖的文件中的内容。代码是用 JScript 编写的。我想添加一些线程代码来在 CPU 之间分发文件,因为其他 CPU 似乎处于空闲状态。我尝试在 JScript 中使用 System.Threading.ThreadPool 类,特别是 QueueUserWorkItem 方法,但在运行时出现错误:
Unhandled Exception: System.InvalidCastException: Unable to cast object of type 'Microsoft.JScript.Closure' to type 'System.Threading.WaitCallback'.
这是我的代码:
var conv = function MyConverter(arg1)
{
// do the work
};
ThreadPool.QueueUserWorkItem( WaitCallback(conv) );
如果我将代码更改为调用“new WaitCallback(conv)”,则会收到此 jsc.exe 编译器错误:
error JS1258: Delegates should not be explicitly constructed, simply use the method name
所以我尝试了:
ThreadPool.QueueUserWorkItem( conv );
但是我们又回到了上面完全相同的 InvalidCastException。
最佳答案
问题是“全局”函数不能以这种方式用作委托(delegate)。这是从它们创建的委托(delegate)是使用以下命令创建的事实的副作用:
Delegate.CreateDelegate( Type, Object, String )
其中第二个参数“Object”是将调用该方法的对象的实例。
您需要创建一个类来完成您想要做的事情,例如:
import System;
import System.Threading;
class MyConverterClass
{
function QueueUserWorkItem()
{
return ThreadPool.QueueUserWorkItem(MyConverter);
}
function MyConverter()
{
print("Hello World.");
}
}
// Example usage
var converter = new MyConverterClass();
converter.QueueUserWorkItem();
print("All done.");
这应该可以正常编译并运行,我使用 JSC 10.00.30319 来测试它。
您可以通过在类中创建几个实例变量来使用类实例来存储您计划在闭包中存储的任何状态(如果有)。
希望这有帮助。
关于.net - 如何将 JScript Closure 转换为 JScript 中的 .NET 委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5100100/