Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

System.Reflection.MethodInfo.Invoke and multiple threads

Hi how do i call System.Reflection.MethodInfo.Invoke() with paramters with threads.

For instance..

Say I have a method that allows you to pass in a string that represents a class name and calls corresponding class method dynamically , now i want to call this Methodinfo.invoke with threads ,I have no idea how to do this since i am calling invoke with paramter . Code snippet given meblow . Thank you for your help

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.. ????**
like image 810
Verve Innovation Avatar asked Dec 12 '22 19:12

Verve Innovation


2 Answers

Since you're wanting to create a new thread with System.Threading.Thread rather than make the call on an existing UI thread or threadpool thread, first thing to notice is that with System.Threading.Thread you can use either a ThreadStart or ParameterizedThreadStart delegate.

You do want parameters to your thread's main method, but ParameterizedThreadStart only allows an object, which forces you to cast it to the required type. So we'll just use a closure to get all the arguments passed across in a type-safe way.

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

Example usage:

mi.InvokeOnNewThread(obj, parameters);

If you're working with .NET 2.0, then take out the keyword this from the parameter list and call like:

InvokeOnNewThread(mi, obj, parameters);

This will discard any return value, but so did the unthreaded example in your question. If you need the return value leave a comment.

like image 114
Ben Voigt Avatar answered Dec 15 '22 09:12

Ben Voigt


You can start a thread with an anonymous method:

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();

The code inside the delegate() { ... } is an anonymous method that is executed on the new thread.

like image 43
SLaks Avatar answered Dec 15 '22 07:12

SLaks