处理线程中的参数

时间:2009-10-10 17:36:04

标签: c# multithreading delegates

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

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

(1)在线程上传递params(变量参数)?

(2)支持像list这样的通用参数?

3 个答案:

答案 0 :(得分: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 ...
};

答案 1 :(得分: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); 

答案 2 :(得分:0)

顺便说一下,对于泛型,定义诸如Doer(Of T1),Doer(Of T1,T2)等的类是有用的,这些类具有例如字段。 V1作为T1,V2作为T2等,以及作为动作(动作T1,T2)等,以及调用动作(V1,V2)和静态工厂方法的单个方法Exec(void)等。这使得组装一个MethodInvoker非常容易,该方法使用适当的参数调用函数,即使在VS2005中也是如此。