2011-02-27 103 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()'返回一個列表? – 2011-02-27 19:39:11

+0

@Rami:很可能是......否則它不會事件編譯...... – digEmAll 2011-02-27 19:43:57

+0

@Albin Sunnanbo'abc'是在事件處理方法內部聲明的。我忘了添加它並編輯當前 – thecodekid 2011-02-27 20:04:48

回答

0

變量abc具有您想要的值直到您得到您的事件處理程序,可能是在它被刪除時,因爲它直接使用e.Result

熟悉.Clone()方法和IClonable接口,並嘗試創建有問題的列表的COPY,而不是參考。

+0

這不是C#的工作原理。只要有參考指向它,該列表就會退出並生效。通過傳遞/保存引用,對象保持活動狀態。我們不是在討論C/C++的局部變量。與C/C++相比,C'總是使用malloc/new,即使不使用任何指針。 – Mario 2011-02-27 22:34:50

0

如果abc是一個列表,mainList將被設置爲相同的列表。您不必複製列表,它應該保持活動狀態,因爲它有一個引用,因此它不會收集垃圾。

當你說mainList是空的時候,你在調試器中立即在xx_DownloadStringCompleted方法中設置了它之後是否看它​​?或者你在程序中的其他地方查看它?

我想這是一個線程問題。您的事件處理程序是否從不同的線程中調用?如果是這樣,您需要添加一些同步邏輯,以確保mainList可用於其他線程。

+0

即時消息在我的程序中的其他地方看... – thecodekid 2011-02-28 10:31:40

相關問題