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.. ????**
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With