2011-02-27 5 views
0

나는 프로그램을 만들고 있지만 문제는 내가 계속 걱정하고있다. 나는 초심자이며 경쟁을위한 프로그램을 만들고있다. 문제가있는 코드는 다음과 같다 :이벤트 핸들러 내부에서 전역 변수에 값을 할당 하시겠습니까?

class Blabla : Usercontrol 
{ 
    public List<string> mainList; 

    public Blabla() 
    { 
     mainList = new List<string>(); 
     something.DownloadStringCompleted += new DownloadStringCompletedEventHandler(xx_DownloadStringCompleted); 
    } 
    void xx_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     List<string> abc = SomeMethod(e.Result); 
     mainList = abc; 
    } 
} 

시도해 봅니다. "abc"변수에 원하는 값이 있긴하지만 mainList는 비어 있습니다. 이유와 작동 방식을 알지 못합니다. 그래서 손이 필요합니다. 감사합니다.

+0

더하기 'SomeMethod()'가 List 을 반환합니까? –

+0

@ 라미 : 아마도 그렇습니다. 그렇지 않으면 이벤트가 컴파일되지 않습니다. – digEmAll

+0

@Albin Sunnanbo 'abc'는 이벤트 처리 메소드 내부에서 선언됩니다. 나는 그것을 추가하는 것을 잊어 버렸고 현재 편집했다. – thecodekid

답변

0

변수 abc은 이벤트 핸들러에서 빠져 나올 때까지 원하는 값을가집니다. e.Result을 직접 사용하므로 삭제 될 때가 있습니다.

.Clone() 메서드와 IClonable 인터페이스를 숙지하고 참조가 아닌 해당 목록의 복사본을 만들어보십시오.

+0

그것은 C#이 작동하는 방식이 아닙니다. 목록은 가리키는 참조가있는 한 종료되고 유효합니다. 참조를 전달/저장함으로써 객체는 활성 상태를 유지합니다. C/C++의 지역 변수에 대해서는 언급하지 않습니다. C/C++과 비교하면 C '는 포인터를 사용하지 않아도 항상 malloc/new를 사용합니다. – Mario

0

abc가 목록 인 경우 mainList는 동일한 목록으로 설정됩니다. 목록을 복제 할 필요가 없으며 참조가 있으므로 활성 상태를 유지해야하므로 가비지 수집을하지 않습니다.

mainList가 비어 있다고 말하면 xx_DownloadStringCompleted 메서드에서 설정 한 직후에 디버거에서 보았습니까? 아니면 프로그램에서 다른 곳을보고 있습니까?

저는 이것이 스레딩 문제라고 생각합니다. 이벤트 처리기가 다른 스레드에서 호출 되나요? 그렇다면 mainList를 다른 스레드에서 사용할 수 있도록 일부 동기화 로직을 추가해야합니다.

+0

메신저 내 프로그램의 다른 곳에서 그것을보고 .. – thecodekid

관련 문제