2 Stimmen

Wie konvertiere ich eine JScript-Schließung in einen .NET-Delegaten in JScript?

Ich habe eine 'for'-Schleife, die Dinge in Tausenden von Dateien umwandeln muss, die nicht voneinander abhängen. Der Code ist in JScript geschrieben. Ich würde gerne etwas Threading-Code hinzufügen, um die Dateien auf die CPUs zu verteilen, da die anderen scheinbar im Leerlauf sind. Ich versuche, die Klasse System.Threading.ThreadPool, insbesondere die QueueUserWorkItem-Methode, in JScript zu verwenden, erhalte aber zur Laufzeit eine Fehlermeldung, die lautet:

Unhandled Exception: System.InvalidCastException: Unable to cast object of type 'Microsoft.JScript.Closure' to type 'System.Threading.WaitCallback'.

Hier ist mein Code:

var conv = function MyConverter(arg1)
{
    // do the work
};

ThreadPool.QueueUserWorkItem( WaitCallback(conv) );

Wenn ich meinen Code so ändere, dass ich "new WaitCallback(conv)" aufrufe, erhalte ich diesen jsc.exe-Compilerfehler:

error JS1258: Delegates should not be explicitly constructed, simply use the method name

Also habe ich das mit versucht:

ThreadPool.QueueUserWorkItem( conv );

Aber dann sind wir wieder genau die gleiche InvalidCastException oben.

3voto

apiguy Punkte 5164

Das Problem ist, dass "globale" Funktionen auf diese Weise nicht als Delegierte verwendet werden können. Dies ist ein Nebeneffekt der Tatsache, dass die von ihnen erstellten Delegierten mit erstellt werden:

Delegate.CreateDelegate( Type, Object, String )

Der zweite Parameter "Object" ist die Instanz des Objekts, für das die Methode aufgerufen werden soll.

Sie müssen eine Klasse erstellen, die das tut, was Sie vorhaben, etwa so:

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.");

Dies sollte kompiliert werden und gut laufen, ich habe JSC 10.00.30319 verwendet, um es zu testen.

Sie können die Klasseninstanz verwenden, um den Zustand zu speichern, den Sie in der Schließung speichern wollten (falls vorhanden), indem Sie ein paar Instanzvariablen in der Klasse erstellen.

Ich hoffe, das hilft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X