2010-07-20 8 views
8

निष्पादित करने के लिए नया थ्रेड कैसे बनाएं शीर्षक बहुत अधिक कहता है। मेरे पास कुछ विधियां हैं जिन्हें एक नए थ्रेड पर चलाने की आवश्यकता है और चूंकि थ्रेड बनाने से पहले सभी कोड काफी समान हैं, मैंने सोचा कि मैं एक ऐसा फ़ंक्शन तैयार करूंगा जो एक क्रिया पैरामीटर के रूप में ले सकता है जिसे मुझे आमंत्रित करने की आवश्यकता है।एक्शन <T>

समस्या यह है कि, मुझे यह नहीं मिला है कि इस कार्रवाई को निष्पादित करने के लिए थ्रेड को कैसे बताना है। क्या यह भी संभव है? मैं जो करने की कोशिश कर रहा हूं उसका एक छोटा सा नमूना कोड यहां दिया गया है।

private void ExecuteInBiggerStackThread(Action<Helper> action, Helper h) 
{ 
    var operation = new ParameterizedThreadStart(obj => action((Helper)obj)); 
    Thread bigStackThread = new Thread(operation, 1024 * 1024); 

    bigStackThread.Start(h); 
    bigStackThread.Join(); 
} 
+0

ढेर बड़ा नहीं है। यह वास्तव में x64 पर छोटा है। –

+0

वह कोड आईआईएस 7 पर चलता है :) – sebagomez

उत्तर

7

कुछ कार्रवाई के शरीर में Helper लिए डाली चाहिए ParameterizedThreadStart से परेशान भी नहीं है। संकलक गंदे काम करते हैं:

private void ExecuteInBiggerStackThread(Action<Helper> action, Helper h) 
{ 
    Thread bigStackThread = new Thread(() => action(h), 1024 * 1024); 

    bigStackThread.Start(); 
    bigStackThread.Join(); 
} 

बेशक, आप इस एक कदम और आगे ले सकता और करने के लिए हस्ताक्षर बदलने के लिए:

private void ExecuteInBiggerStackThread(Action action) { ... } 
0

चाल करने के लिए Action<object> उपयोग करने का प्रयास करें और फिर इस तरह

8

मैं wouldn:

private void ExecuteInBiggerStackThread(Action<Helper> action, Parameters parms) 
{ 
    ParameterizedThreadStart operation = new ParameterizedThreadStart(action);// here's the mess 
    Thread bigStackThread = new Thread(operation, 1024 * 1024); 

    bigStackThread.Start(parms); 
    bigStackThread.Join(); 
} 

सादर,
seba

3

या विधि का एक और अधिक जेनेरिक वर्जन ....

protected void ExecuteInBiggerStackThread<T>(Action<T> action, T parameterObject) 
{ 
    var bigStackThread = new Thread(() => action(parameterObject), 1024 * 1024); 
    bigStackThread.Start(); 
    bigStackThread.Join(); 
} 
संबंधित मुद्दे