2011-02-27 101 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

相关问题