【问题标题】:Change a form label text value when setting a static int设置静态 int 时更改表单标签文本值
【发布时间】:2013-12-30 18:24:27
【问题描述】:

当从另一个静态 void 更改静态 int 值时,我正在尝试更改表单标签的文本值 (frmWebInput.ConnectedUserCount.Text)...

基本上:这是一个简单的网络服务器,我试图在提供每个页面时跟踪连接的用户。它似乎可以工作,但表单标签并没有改变?

/**
 * @type int Total connected users.
 */
 private static int _connectedUsers = 0;
 public static int connectedUsers {
     get { return _connectedUsers; }
     set
     {
         _connectedUsers = value;
         frmWebInput MyForm = new frmWebInput();
         MyForm.ConnectedUserCount.Text = String.Format("Connected Users: {0}", value);
     }
 }

public static void clientListener()
    {
        while (true)
        {
            try
            {
                HttpListenerContext request = listener.GetContext();
                ThreadPool.QueueUserWorkItem(processRequest, request);
            }
            catch (Exception e) {  }
        }
    }

public static void processRequest(object listenerContext)
{
        try
        {
           connectedUsers = connectedUsers + 1;
        }
}

【问题讨论】:

  • 每次设置静态时都会创建一个新表单。您在某处有对表单的静态引用吗?
  • 这个应用程序是多线程的吗? (我假设是这样,因为 Web 服务器可能随时接收请求。)您需要添加锁定以正确保护静态值。

标签: c# .net


【解决方案1】:

这是在 Web 服务器上运行的 WinForms 应用程序吗?还是这是一个 WebForm?

无论如何,您永远不会显示表单:

frmWebInput MyForm = new frmWebInput();
MyForm.ConnectedUserCount.Text = String.Format("Connected Users: {0}", value);

每次设置值时,您都会创建frmWebInput 的新实例并在该实例上设置文本。但你从不表现出来。如果一个已经在应用程序的其他地方显示,你永远不会设置它的文本。

您需要对正在显示的表单实例的引用。比如:

private static frmWebInput MyForm { get; set; }

private static int _connectedUsers = 0;
public static int connectedUsers {
    get { return _connectedUsers; }
    set
    {
        _connectedUsers = value;
        MyForm.ConnectedUserCount.Text = String.Format("Connected Users: {0}", value);
    }
}

当然,该引用必须使用表单的实例进行设置。因为它是static,所以它必须在静态初始化程序中。无论是那个还是代替自动实现的属性,它都可以只是一个get,它动态地获取表单的实例。很难就最佳方法提出建议,因为我不知道这段代码如何与表单实例交互。

【讨论】:

  • 别忘了同步静态。
  • @xxbbcc:确实,线程安全在这里很可能成为一个问题。这个应用程序架构的大图可能存在一些缺陷。
  • 大声笑,是的,它看起来很可疑。 :) 也许这只是一个实验。
  • lol 抱歉,这只是一个宠物项目,因为我基本上是在自学 C#!
  • @c0nfus3d1:在这种情况下,您面临的主要问题是同一类型的两个实例实际上并不是同一件事。例如,想象在现实生活中,如果您购买了两辆相同的汽车。它们在各方面都相同,但它们不是同一辆车。在这种情况下,您需要您的代码引用现有实例,而不是创建新实例。
猜你喜欢
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 2014-06-30
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
相关资源
最近更新 更多