Question

Salut comment appeler System.Reflection.MethodInfo.Invoke () i avec paramters avec des fils.

Par exemple ..

Dire que j'ai une méthode qui vous permet de passer dans une chaîne qui représente un nom de classe et appels méthode de classe correspondant dynamiquement, maintenant je veux appeler ce MethodInfo.Invoke avec des fils, je ne sais pas comment faire cela depuis que je fais appel à Invoke paramter. Extrait de code donné meblow. Nous vous remercions de votre aide

Type classType = objAssembly.GetType("MyClassName");
object obj = Activator.CreateInstance(classType)
bject[] _objval = new object[3]; 
object[] parameters = new object[] { _objval };
MethodInfo mi = classType.GetMethod("MyMethod");
mi.Invoke(obj, parameters);  // <---**How do i call this with threads.. ????**
Était-ce utile?

La solution

Puisque vous êtes désireux de créer un nouveau thread avec System.Threading.Thread plutôt que de faire l'appel sur un thread d'interface utilisateur existante ou threadpool fil, la première chose à noter est que, avec System.Threading.Thread vous pouvez utiliser un délégué ThreadStart ou ParameterizedThreadStart.

Vous ne voulez paramètres à la méthode principale de votre fil, mais ParameterizedThreadStart permet seulement une object, qui vous oblige à jeter aux type requis. Nous allons donc utiliser une fermeture pour obtenir tous les arguments passés à travers d'une manière de type sécurisé.

public void InvokeOnNewThread(this MethodInfo mi, object target, params object[] parameters)
{
     ThreadStart threadMain = delegate () { mi.Invoke(target, parameters); };
     new System.Threading.Thread(threadMain).Start();
}

Exemple d'utilisation:

mi.InvokeOnNewThread(obj, parameters);

Si vous travaillez avec .NET 2.0, puis prenez le this mot-clé dans la liste des paramètres et appel comme:

InvokeOnNewThread(mi, obj, parameters);

Ceci annule toute valeur de retour, mais ce fut l'exemple dévissée dans votre question. Si vous avez besoin de la valeur de retour laisser un commentaire.

Autres conseils

Vous pouvez démarrer un thread avec une méthode anonyme:

Thread myThread = new Thread(delegate() {
    object obj = Activator.CreateInstance(typeof(MyClassName));

    object[] _objval = new object[3]; 
    object[] parameters = new object[] { _objval };
    MethodInfo mi = classType.GetMethod("MyMethod");
    mi.Invoke(obj, parameters); 
});
myThread.Start();

Le code à l'intérieur du delegate() { ... } est une méthode anonyme qui est exécuté sur le nouveau fil.

Juste une suggestion, pourquoi ne pas utiliser .Net 4.0 Framework, il a une mise en œuvre de filetage plus facile. Il suffit d'utiliser Parallel.For, Parallel.ForEach () ou Parallel.Invoke (). Quelques explications plus ici -> http://anyrest.wordpress.com/2010/09/09/parallel-programming-easier-than-ever-using-net-framework-4/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top