none
런타임에러 발생했는데 해결법을 모르겠습니다 도와주세요~ RRS feed

  • 질문

  • 2018-08-30 12:41:59.3220 ERROR 스크립트에서 런타임 에러 발생.    위치: System.Array.Copy(Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length, Boolean reliable)
       위치: System.Collections.Generic.List`1.CopyTo(T[] array, Int32 arrayIndex)
       위치: System.Collections.ObjectModel.Collection`1.CopyTo(T[] array, Int32 index)
       위치: System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
       위치: System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
       

    이렇게 오류가났는데 어떤부분에 어떤식의문제가 발생한건가요?




    • 편집됨 독스 2018년 9월 11일 화요일 오후 2:46
    2018년 8월 30일 목요일 오후 4:00

답변

  • 그런 오류가 발생하는 경우는, 동일한 목록에 대해 한쪽에서 Enumerable로 열거하고 있는데 다른 한 쪽에서 목록을 변경시킨 경우입니다. 다음의 코드로 쉽게 재현할 수 있습니다.

    using System;
    using System.Collections.ObjectModel;
    
    public class Program
    {
        public static void Main(string[] args)
        {
            ObservableCollection<int> list = new ObservableCollection<int>();
            list.Add(0);
    
            foreach (var item in list)
            {
                list.Add(2);
                Console.WriteLine(item);
            }
        }
    }
    

    다른 점이라면, 질문하신 분의 코드에서는 foreach는 아니지만 마찬가지로 Enumerable을 호출하는 First를 접근했기 때문입니다

    • 답변으로 표시됨 독스 2018년 9월 14일 금요일 오전 2:02
    2018년 9월 12일 수요일 오전 4:05

모든 응답

  • 로그로 남긴 예외 메시지 같은데 정작 중요한 "Exception" 타입을 기록하지 않아 어떤 오류인지 알 수가 없군요.

    일단, 대개의 경우에는 Array.Copy니까 해당 Array에 맞지 않는 크기로 복사를 해 문제가 발생할 가능성이 큽니다. 가령 IndexOutOfRangeException일 것입니다.

    2018년 8월 31일 금요일 오전 12:45
  • "Exception" 타입을 기록

    이라고하면 어떤걸 말씀하시는건가요? 제가 c#을 너무 몰라서 기본적 용어를 모르겠습니다

    이게 누군가 만들어놓은 프로그램위에 스크립트만 작성해서 사용하는 부분이라 제가 일일히 비주얼베이직으로 작성하는게 아니거든요

    제가 뭘 추가로 작성하면 저 질문의 답글에 도움이될까요?

    2018년 9월 11일 화요일 오후 2:38
  • 보통 예외가 발생하면 다음과 같은 정보를 얻을 수 있습니다.

    Unhandled Exception: System.Threading.ThreadStateException: Thread is not running; it cannot be suspended.
       at System.Threading.Thread.SuspendInternal()
       at System.Threading.Thread.Suspend()
       at ConsoleApp1.Program.Main(String[] args) 
    

    그리고 위에서 직접적으로 System.Threading.ThreadStateException이라는 예외 정보를 볼 수 있습니다. 그런데, 질문하신 분이 올려주신 내용에는 저 직접적인 예외 정보가 없습니다. 아마도 저 로그를 남기는 부분에서 InnerException에 대한 정보를 누락하고 찍은 것 같은데 전쳬 예외를 남기도록 로그를 개선해야 합니다.

    2018년 9월 11일 화요일 오후 3:10
  • 그러면 제가 더이상 알려드릴수있는 부분이 없네요 ㅠ

    저 로그부분은 제가 관여할수있는부분이 아니라서요 ㅎㅎ...

    그래도 친절한 답변 감사합니다ㅜㅜ

    배열의 크기보다 복사되는양이 많을경우(Array에 맞지않는크기로 복사될경우)에 저런 문제가 발생할수있다는거죠?

    그렇다면호기 배열을 최대한 크게 키우는법이 있나요?


    • 편집됨 독스 2018년 9월 11일 화요일 오후 5:12
    2018년 9월 11일 화요일 오후 4:59
  • 그것 역시 소스 코드를 바꿔야 하지 않을까요?
    2018년 9월 11일 화요일 오후 11:44
  • 그렇군요 답글달아주셔서 감사합니다 ㅎㅎ

    하나만 더 여쭤볼게요

    문제발생지점이 기존의

    System.Collections.ObjectModel.ObservableCollection<T>.ToList(); 부분인데요

    여기서 .ToList()를 제외하고 System.Collections.ObjectModel.ObservableCollection<T>; 까지만 작성해도

    컴파일은 성공합니다(리스트가 실시간으로 업데이트 되기때문에 응답속도로인한 왜곡을 방지하기위하여 리스트를 따로 복사해두어 사용하고자 하였습니다)

    근데 .ToList()를 제외하고 실행했을경우 아래와같이 오류가 발생합니다

    2018-09-12 09:02:38.2613 ERROR 스크립트에서 런타임 에러 발생.    위치: System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
       위치: System.Collections.Generic.List`1.Enumerator.MoveNextRare()
       위치: System.Collections.Generic.List`1.Enumerator.MoveNext()
       위치: System.Linq.Enumerable.<SkipIterator>d__31`1.MoveNext()
       위치: System.Linq.Enumerable.First[TSource](IEnumerable`1 source)

    혹시 참고가 될런지요.. 바쁜와중에 자꾸 질문달아서 죄송합니다 좀 급한부분이라 ㅜㅜㅜ

    2018년 9월 12일 수요일 오전 1:22
  • 그런 오류가 발생하는 경우는, 동일한 목록에 대해 한쪽에서 Enumerable로 열거하고 있는데 다른 한 쪽에서 목록을 변경시킨 경우입니다. 다음의 코드로 쉽게 재현할 수 있습니다.

    using System;
    using System.Collections.ObjectModel;
    
    public class Program
    {
        public static void Main(string[] args)
        {
            ObservableCollection<int> list = new ObservableCollection<int>();
            list.Add(0);
    
            foreach (var item in list)
            {
                list.Add(2);
                Console.WriteLine(item);
            }
        }
    }
    

    다른 점이라면, 질문하신 분의 코드에서는 foreach는 아니지만 마찬가지로 Enumerable을 호출하는 First를 접근했기 때문입니다

    • 답변으로 표시됨 독스 2018년 9월 14일 금요일 오전 2:02
    2018년 9월 12일 수요일 오전 4:05
  • 감사합니다~~

    2018년 9월 14일 금요일 오전 2:02