gpt4 book ai didi

.net - 如何将 JScript 闭包转换为 JScript 中的 .NET 委托(delegate)?

转载 作者:行者123 更新时间:2023-11-29 20:18:34 24 4
gpt4 key购买 nike

我有一个“for”循环,它必须转换数千个相互不依赖的文件中的内容。代码是用 JScript 编写的。我想添加一些线程代码来在 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 闭包转换为 JScript 中的 .NET 委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5100100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com