2009-02-03 27 views
7

Tôi đang sử dụng mã này, nơi tôi đang gọi phương thức run của một danh sách các lớp học mà tôi nạp tự động từ dlls:C#: Gọi một phương thức với [Loại] .InvokeMember() trong một chủ đề riêng biệt

for (int i = 0; i < robotList.Count; i++) 
{ 
    Type t = robotList[i]; //robotList is a List<Type> 
    object o = Activator.CreateInstance(t); 
    t.InvokeMember("run", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, null); 
} 

invokeMember gọi phương thức run của mỗi lớp trong danh sách.

Bây giờ làm cách nào tôi có thể gọi phương thức run này từ invokeMember trong một Chủ đề riêng? Vì vậy, tôi sẽ có các luồng riêng biệt chạy cho từng phương thức được gọi.

Trả lời

19

Nếu bạn biết rằng tất cả các loại được nạp động của bạn đều triển khai Chạy, bạn có thể yêu cầu tất cả chúng triển khai IRunable và loại bỏ phần phản chiếu không?

Type t = robotList[i]; 
IRunable o = Activator.CreateInstance(t) as IRunable; 
if (o != null) 
{ 
    o.Run(); //do this in another thread of course, see below 
} 

Nếu không, điều này sẽ làm việc:

for (int i = 0; i < robotList.Count; i++) 
{ 
    Type t = robotList[i]; 
    object o = Activator.CreateInstance(t); 
    Thread thread = new Thread(delegate() 
    { 
     t.InvokeMember("Run", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, null); 
    }); 
    thread.Start(); 
} 
+0

Tuyệt vời, chính xác những gì tôi đang tìm kiếm. Và cảm ơn vì đã đề cập đến IRunable ... Tôi đang thử nó ngay bây giờ. Cảm ơn bạn lần nữa. –

+0

Tuyệt vời ... Đã thay đổi các lớp để sử dụng giao diện IRunnable như bạn đã đề xuất. –

2

Hãy nhìn vào mẫu này cho một cách để làm việc đó:

using System; 
using System.Threading; 
using System.Reflection; 
using System.Collections.Generic; 

namespace Obfuscation 
{ 
    public class Program 
    { 
     static Type[] robotArray = new Type[] { typeof(Program) }; 
     static List<Type> robotList = new List<Type>(robotArray); 

     internal void Run() 
     { 
      Console.WriteLine("Do stuff here"); 
     } 

     internal static void RunInstance(object threadParam) 
     { 
      Type t = (Type)threadParam; 
      object o = Activator.CreateInstance((Type)t); 
      t.InvokeMember("Run", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic, null, o, null); 
     } 

     public static void Main(string[] args) 
     { 
      for (int i = 0; i < robotList.Count; i++) 
      { 
       ThreadPool.QueueUserWorkItem(new WaitCallback(RunInstance), robotList[i]); 
      } 
     } 
    } 
} 
+0

Bugger, tôi đã thề tôi làm mới trang này trước khi nhấn gửi :) –

Các vấn đề liên quan