从Project2 Class2调用时,在Project1 Class1中声明为public的对象始终显示为null

时间:2015-10-30 09:07:37

标签: c# .net web-services .net-4.5

我正在使用C#,。Net framework 4.5 我的解决方案中有两个项目,比如Project1和Project2,其中Project1被添加为Project2的参考。 在Project1中,我有一个静态类“Global”,其中我声明了一个公共静态List of object:

namespace Solution.Project1
{
    public static class Global
    {
        public static List<OM.User> AllActiveUsers;
    }
}

在Project2中,我还有一个静态类“UserFactory”,其中我有一个静态方法,它使用Project1中的“AllActiveUsers”变量:

namespace Sol.Project2
{
    public static class UserFactory
    {
    public static List<OM.User> GetUsersDetails()
        {
            List<OM.User> ret = new List<OM.User>();

            foreach (OM.User user in Project1.Global.AllActiveUsers) //here is the problem
            {
                //TODO: write logic
            }

            return ret;
        }
    }
}

我确保AllActiveUsers已启动并填充了5个User对象,尽管在Project2中调用时它显示为null! 会导致什么?

更新 对不起,我想我明白了,我忘记了Project2中的方法没有被直接调用,它是通过webservice调用的:

await ModMain.objWebService.GetUsersDetailsAsync();

但是如果我马上从UserFactory调用我的方法:

UserFactory.GetUsersDetails();

然后AllActiveUsers不为空。 是什么导致了这个问题? 也许这篇文章在从webservice调用方法时被转换为有关问题的信息。

2 个答案:

答案 0 :(得分:1)

经过一番搜索后,我想我发现了问题。

Web服务应用程序中的静态变量具有指向worker proccess的生命周期链接,因此可以自动重新初始化它们。它们不应用于此类应用。其中一个来源:Web service variable shared for the lifetime of the webservice?

解决方案可能是使用应用程序状态在请求之间存储对象:http://www.codeproject.com/Articles/13402/Building-web-services-with-persistent-state

答案 1 :(得分:0)

它必须是您初始化列表的位置。你说program.cs,但我已经复制了你的代码。

项目2:

class Program
{
    static void Main(string[] args)
    {
        ConsoleApplication1.Global.AllActiveUsers = new List<string>() { "test1", "test2" };
        UserFactory.GetUsersDetails();
    }
}

public static class UserFactory
{
    public static List<string> GetUsersDetails()
    {
        List<string> ret = new List<string>();

        foreach (string user in ConsoleApplication1.Global.AllActiveUsers) //here is the problem
        {
            //TODO: write logic
        }

        return ret;
    }
}

项目1

public static class Global
{
    public static List<string> AllActiveUsers;
}

你这样做很好,因为我在调用静态方法之前初始化列表内联。

如果您准确提供了初始化列表的位置,那么它可能会为您的问题提供更多信息。