从事件处理程序内部为全局变量赋值?

时间:2011-02-27 19:15:08

标签: c# winforms events

我正在制作一个程序,但我面临的一个问题是让我担心。我是新手,我正在为竞争建立这个程序。问题所在的代码如下:

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仍然是空的。我不知道为什么以及如何使它工作。这就是为什么我需要一些手。谢谢。

2 个答案:

答案 0 :(得分:0)

变量abc具有您想要的值,直到事件处理程序被删除,因为它被直接使用e.Result而被删除。

熟悉.Clone()方法和IClonable界面,并尝试创建有问题的列表的COPY,而不是参考。

答案 1 :(得分:0)

如果abc是一个列表,mainList将被设置为相同的列表。您不必克隆列表,它应该保持活动状态,因为它有对它的引用,因此它不会被垃圾收集。

当你说mainList为空时,你是否在xx_DownloadStringCompleted方法中设置后立即在调试器中查看它?或者你在程序的其他地方看它?

我猜这是一个线程问题。您的事件处理程序是否从另一个线程调用?如果是这样,您需要添加一些同步逻辑,以保证mainList可用于您的其他线程。