2010-09-13 100 views
4

您好我如何調用System.Reflection.MethodInfo.Invoke()參數與線程。System.Reflection.MethodInfo.Invoke和多線程

例如..

說我有一個方法,可以讓你在表示 類名和動態調用相應的類方法傳遞了一個字符串,現在我想 調用這個Methodinfo.invoke與線程,我不知道如何做到這一點,因爲我調用參數調用。代碼片段給予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.. ????** 
+0

是否要對UI線程,線程池線程或新的工作線程進行跨線程調用? – 2010-09-13 02:46:37

+2

你的問題沒有意義。 – SLaks 2010-09-13 02:47:37

+0

嘿,我是C#的新手,每天都在學習它。我對線程的想法很少。通常我稱之爲Thread Thread = new Thread(pts); t.Start(); 。同樣,我想調用這個mi.invoke機智hthreads。希望你明白我在說什麼 – 2010-09-13 02:54:55

回答

11

既然你想創建一個新線程System.Threading.Thread而不是使在現有的UI線程或線程池線程的調用,要注意的第一件事是,隨着System.Threading.Thread您可以使用代表ThreadStartParameterizedThreadStart

你確實需要參數給你的線程的主要方法,但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); 

這將拋棄任何返回值,但你的問題中的無絲毫例子也是如此。如果你需要返回值留下評論。

+0

對於可讀代碼+1。 – 2010-09-13 03:31:30

+0

這是完美的我親愛的朋友。非常感謝。可以向我解釋一下ThreadStart threadMain = delegate()的作用。直到上週我纔開始在C++程序員之後使用C#2年。我知道委託非常像函數指針... – 2010-09-13 03:35:16

+1

您已經在您的代碼中使用委託:'new Thread(pts);'但是委託引用了一個命名方法。在這裏,我使用了一個匿名方法,用'delegate'關鍵字創建,以捕獲變量。這是一個C#特性,而不是.NET運行時的一部分。C#編譯器實際上會創建一個存儲捕獲變量「mi」,「target」和「parameters」的類(在C#代碼中使用非常奇怪的名稱非法),並將代碼放入該類中的方法。然後當方法運行時,它可以使用它的'this'指針讀取參數值。 – 2010-09-13 04:05:01

2

可以啓動一個線程與匿名方法:

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() { ... }內是在新的線程中執行一個匿名方法。

0

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

+0

由於'Parallel.Invoke'接受不能接受參數的'Action'委託,所以這並不能真正回答這個問題。讓Parallel Tasks庫管理一個線程池當然是'new Thread'的好替代,但是OP似乎並不想使用線程池。 – 2010-09-13 04:07:37