2012-04-28 11 views
32

मैं निम्नलिखित विधि के साथ एक वर्ग है:गंतव्य ऐरे काफी लंबा नहीं है?

public List<Bike> bikesCopy 
{ 
    get 
    { 
     List<Bike> bs; 
     lock (_bikes) bs = new List<Bike>(_bikes); 
     return bs; 
    } 
} 

कौन सा एक और सूची की एक प्रतिलिपि बनाता, private List<Bike> _bikes;

अजीब बात अब है, मैं निम्नलिखित त्रुटि मिलती है कि:

Destination array was not long enough. Check destIndex and length, and the array's lower bounds.

यहां समस्या क्या है?

+0

आपको अपवाद कहां मिलते हैं? क्या आप अपवाद स्टैक ट्रेस के साथ प्रश्न अपडेट कर सकते हैं और सटीक कोड लाइन को इंगित कर सकते हैं जहां इसे फेंक दिया जाता है? –

+0

हां, यह निम्न संदेश है (गड़बड़ी के लिए खेद है): 'सिस्टम पर। एर्रे.कॉपी (ऐरे स्रोतअरे, इंट 32 स्रोत इंडेक्स, ऐरे गंतव्यअरे, इंट 32 गंतव्य इंडेक्स, इंट 32 लम्बाई, बूलियन विश्वसनीय) सिस्टम.एरे.कॉपी पर (सिस्टम में ऑरे स्रोतअरे, इंट 32 स्रोत इंडेक्स, ऐरे गंतव्यअरे, इंट 32 गंतव्य इंडेक्स, इंट 32 लम्बाई) सिस्टम.कोलेक्शन। जेनेरिक.लिस्ट'1.कॉपीटीओ (टी [] सरणी, इंट 32 सरणी इंडेक्स) सिस्टम पर। चयन। जेनरिक.लिस्ट 1। .ctor (IEnumerable'1 संग्रह) MyGame.Player.get_bikesCopy() ' – Geert

+2

पर क्या आप इस समस्या के मूल कारण को प्राप्त करते हैं? मैं कुछ इसी तरह से चल रहा हूँ। –

उत्तर

51

मैं कहूंगा कि त्रुटि _bikes धागा सुरक्षित नहीं किया जा रहा वस्तु में निहित है। जैसा कि टिप्पणी की गई है, कहीं _bikes ऑब्जेक्ट का एक संशोधित है जिसे लॉक नहीं किया जा रहा है।

यह एक दूसरे विभाजन त्रुटि जहां चर bs एक आकार एक्स के लिए सेट है जब _bikes के आकार को मापा जाता है। अगली विभाजित दूसरी में, क्योंकि यह सूची भरने जा रहा है, _bikes ऑब्जेक्ट में आकार देने में आकार बढ़ गया है।

तो अपने कोड पर जाएं। अपने _bikes ऑब्जेक्ट के सभी संदर्भ खोजें और सुनिश्चित करें कि वे थ्रेड सुरक्षित हैं (लॉक के साथ)।

+0

मुझे बहुत खेद है, मैंने गलती से डाउनवोट पर क्लिक किया लेकिन मैं वास्तव में ऊपर उठाना चाहता था और अब मैं अब वोट नहीं दे सकता: -/क्षमा करें !! –

+0

यह ठीक है। सबसे बुरी बात यह है कि जब आप मतदान करते हैं और क्यों नहीं जानते हैं। – Wolf5

+0

हाँ, मुझे कुछ दिन पहले "प्रशंसक" मिला (18 मिनट के भीतर 18 डाउनवॉट्स) और एंटी-सीरियल-डाउनवॉटिंग बॉट के बारे में सीखा। मुझे वास्तव में वह बॉट पसंद है :-) पीएस .: वेबसाइट कहती है, अगर आप उत्तर संपादित करते हैं, तो मैं फिर से डाउनवोट पूर्ववत कर सकता हूं। –

6

वैसे आप की कोशिश कर सकते:

using System.Linq; //ToList() is an extension function defined here 
... 
lock(_bikes) 
    return _bikes.ToList(); 

अपवाद की जानकारी यहां चर्चा कर रहे हैं: Why doesn't a foreach loop work in certain cases?

+1

मैं LINQ का उपयोग करने में सक्षम नहीं हूं, क्योंकि यह मेरे ढांचे पर श्वेतसूची नहीं है .... वैसे भी, यह मेरी समस्या का उत्तर नहीं देता है :) – Geert

+7

आप LINQ का उपयोग नहीं कर सकते ?!?!? जैसे ही मैंने इसे पाया, मैं उस नौकरी को छोड़ दूंगा! –

+0

यकीन नहीं क्यों, लेकिन '.LList()' नई सूची (YourList) 'बनाम महान काम करता है, जो हमेशा अपवाद फेंकता है। –

0

वास्तव में कोई जवाब नहीं, एक शोध टिप्पणी।

मैं एक ही समस्या में भाग गया और एक त्वरित परीक्षण किया। मैंने नीचे दिए गए कोड के साथ प्रयास किया और ArgumentException: Destination array was not long enough फेंकने के लिए यह कोड नहीं मिला। लेकिन जब मैं

return allLines.ToList().ToArray(); 

लाइन से .ToList() हटाने इसे तुरंत दुर्घटनाओं।

यह डेमो कोड है और यहां तक ​​कि आईडीई मुझे बताता है, मुझे ToList() कॉल को अनावश्यक लगता है क्योंकि इसे हटा देना चाहिए।

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading; 

namespace ConsoleApp1 
{ 
    class Program 
    { 
     static void Main() { 

      List<string> thelist = new List<string>(); 

      Thread producer = new Thread(() => { 
       while (true) { 
        thelist.Add("a" + DateTime.Now); 
       } 
      }); 

      Thread transformer = new Thread(() => { 
       while (true) { 
        string[] thearray = thelist.ToList().ToArray(); 
        Console.WriteLine(thearray.Length); 
       } 
      }); 
      producer.Start(); 
      transformer.Start(); 
      Console.ReadKey(true); 
     } 
    } 
} 

मुझे सच में आश्चर्य है, यह क्यों दुर्घटनाग्रस्त नहीं होगा, क्योंकि सूची को सरणी द्वारा भी समर्थित किया जाता है।

संबंधित मुद्दे