2009-10-10 40 views
1

我只是一个初学者,“ParameterizedThreadStart”接受单个对象作为参数。线程处理参数

是否有任何其他代表签名允许我

(1)通过对螺纹PARAMS(参数变量数)?

(2)支持列表等通用参数?

回答

5

你可以做你想做与单个对象什么。只要定义一个类来包装你感兴趣的参数:

class ThreadState 
{ 
    public ThreadState() 
    { 
    } 

    public string Name 
    { 
     get; 
     set; 
    } 

    public int Age 
    { 
     get; 
     set; 
    } 
} 

// ... 

ParameterizedThreadStart start = delegate(object objThreadState) 
{ 
    // cast to your actual object type 
    ThreadState state = (ThreadState)objThreadState; 

    // ... now do anything you want with it ... 
}; 
+0

或者只传递一个对象数组。 – 2009-10-10 17:47:50

+0

是的,你也可以传递一个数组,这个数组更加轻量级,但是“更安全”。 – bobbymcr 2009-10-10 18:08:58

+0

真的帮了我很多。谢谢。 – user186973 2009-10-10 18:30:10

2

您可以使用Delegate.BeginInvoke和EndInvoke,传递任何参数,你想

delegate long MyFuncDelegate(int N); 

MyFuncDelegate cpn = new MyFuncDelegate(MyFunc); 

IAsyncResult ar = cpn.BeginInvoke(3, null, null); 

// Do some stuff 
while(!ar.IsCompleted) 
{ 
    // Do some stuff 
} 

// we now know that the call is 
// complete as IsCompleted has 
// returned true 
long answer = cpn.EndInvoke(ar); 
0

顺便说一下,仿制药,是非常有用的定义类,如多尔(T1的),杜尔(中T1,T2)等,它们具有字段例如V1作为T1,V2作为T2等,以及作为动作的(T1,T2)等,以及称为动作(V1,V2)和静态工厂方法的单一方法Exec(void)等。这使得组装一个MethodInvoker非常容易,它可以用适当的参数调用函数,即使在VS2005中也是如此。