我正在使用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调用方法时被转换为有关问题的信息。
答案 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;
}
你这样做很好,因为我在调用静态方法之前初始化列表内联。
如果您准确提供了初始化列表的位置,那么它可能会为您的问题提供更多信息。