2013-02-16 28 views
6

मेरा कार्यक्रम संकलन जबकि (मैं monodevelop आईडीई से यह संकलन) मैं एक त्रुटि प्राप्त:कॉल निम्न विधियों या गुण С # के बीच अस्पष्ट है

Error CS0121: The call is ambiguous between the following methods or properties: System.Threading.Thread.Thread(System.Threading.ThreadStart)' and System.Threading.Thread.Thread(System.Threading.ParameterizedThreadStart)' (CS0121)

यहाँ कोड का हिस्सा है।

Thread thread = new Thread(delegate { 
    try 
    { 
     Helper.CopyFolder(from, to); 
     Helper.RunProgram("chown", "-R www-data:www-data " + to); 
    } 
    catch (Exception exception) 
    { 
     Helper.DeactivateThread(Thread.CurrentThread.Name); 
    } 
    Helper.DeactivateThread(Thread.CurrentThread.Name); 
}); 
thread.IsBackground = true; 
thread.Priority = ThreadPriority.Lowest; 
thread.Name = name; 
thread.Start(); 

आपका ध्यान

उत्तर

8

delegate { ... } एक एक गुमनाम विधि है कि को सौंपा जा सकता है किसी भी प्रतिनिधि प्रकार, ThreadStart भी शामिल है और ParameterizedThreadStart। के बाद से धागा कक्षा दोनों तर्क प्रकार के साथ निर्माता भार के प्रदान करता है, यह अस्पष्ट है जो निर्माता अधिभार के लिए है।

delegate() { ... } (कोष्ठक ध्यान दें) एक एक गुमनाम विधि है कि कोई तर्क लेता है। यह केवल सौंपा जा सकता है इस तरह के Action या ThreadStart के रूप में है कि कोई तर्क ले प्रकार, को सौंपने के लिए।

तो, आप ParameterizedThreadStart निर्माता अधिभार उपयोग करना चाहते हैं आप ThreadStart निर्माता अधिभार उपयोग करना चाहते हैं

Thread thread = new Thread(delegate() { 

करने के लिए अपने कोड बदलने के लिए, या

Thread thread = new Thread(delegate(object state) { 

करने के लिए।

2

आप एक विधि भार के है कि जब यह त्रुटि फेंक दिया जाता है और अपने उपयोग के लिए धन्यवाद या तो अधिभार के साथ काम कर सकता है। संकलक यकीन है कि जो ओवरलोड आप स्पष्ट रूप पैरामीटर कास्टिंग द्वारा यह राज्य के लिए की जरूरत है कॉल करना चाहते हैं नहीं है। एक तरह से यह करने के लिए इस तरह है:

Thread thread = new Thread((ThreadStart)delegate { 
    try 
    { 
     Helper.CopyFolder(from, to); 
     Helper.RunProgram("chown", "-R www-data:www-data " + to); 
    } 
    catch (Exception exception) 
    { 
     Helper.DeactivateThread(Thread.CurrentThread.Name); 
    } 
    Helper.DeactivateThread(Thread.CurrentThread.Name); 
}); 
0

वैकल्पिक रूप से, आप एक लैम्ब्डा उपयोग कर सकते हैं:

Thread thread = new Thread(() => 
{ 
    try 
    { 
     Helper.CopyFolder(from, to); 
     Helper.RunProgram("chown", "-R www-data:www-data " + to); 
    } 
    catch (Exception exception) 
    { 
     Helper.DeactivateThread(Thread.CurrentThread.Name); 
    } 
    Helper.DeactivateThread(Thread.CurrentThread.Name); 
}); 

thread.IsBackground = true; 
thread.Priority = ThreadPriority.Lowest; 
thread.Name = name; 
thread.Start();