簡體   English   中英

System.Reflection.MethodInfo.Invoke和多個線程

[英]System.Reflection.MethodInfo.Invoke and multiple threads

您好我如何使用帶有線程的參數調用System.Reflection.MethodInfo.Invoke()。

例如..

假設我有一個方法允許你傳入一個表示類名的字符串並動態調用相應的類方法,現在我想用線程調用這個Methodinfo.invoke,我不知道怎么做,因為我調用了invoke與paramter。 代碼片段給出了meblow。 謝謝您的幫助

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.. ????**

由於您希望使用System.Threading.Thread創建新線程而不是在現有UI線程或線程池線程上進行調用,因此首先要注意的是使用System.Threading.Thread可以使用ThreadStartParameterizedThreadStart代表。

您確實需要參數到線程的main方法,但ParameterizedThreadStart只允許一個object ,它會強制您將其強制轉換為所需的類型。 因此,我們將使用閉包以類型安全的方式獲取所有傳遞的參數。

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

用法示例:

mi.InvokeOnNewThread(obj, parameters);

如果您正在使用.NET 2.0,請從參數列表中取出關鍵字this ,並調用如下:

InvokeOnNewThread(mi, obj, parameters);

這將丟棄任何返回值,但問題中的無螺紋示例也是如此。 如果您需要返回值,請發表評論。

您可以使用匿名方法啟動一個線程:

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

delegate() { ... }的代碼是在新線程上執行的匿名方法。

只是一個建議,為什么不使用.Net 4.0 Framework它有一個更簡單的線程實現。 只需使用Parallel.For,Parallel.ForEach()或Parallel.Invoke()。 這里有一些進一步的解釋 - > http://anyrest.wordpress.com/2010/09/09/parallel-programming-easier-than-ever-using-net-framework-4/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM