2009-10-10 83 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中也是如此。