-1

所以有这样的情况——当控制台应用程序启动时,它会创建 3 个线程,这些线程永远留在那里,做他们应该做的任何事情。然后,这些线程中的任何一个都可以将 Windows 窗体显示为单独的线程,因此它不会等待它使用以下代码返回任何内容:

public void RunThread()
{
    Thread thread = new Thread(new ThreadStart(RunForm));
    thread.Name = "StatusForm";
    thread.Start();
}

public void RunForm()
{
    Application.Run(new StatusForm());
}

然后,此 windows 窗体将尝试从所有 3 个线程中获取一些变量,我这样做是使用:

int var1 = Manager1.InventoryEntriesOne
int var2 = Manager2.InventoryEntriesTwo
int var3 = Manager3.InventoryEntriesThree

第一个线程中的 InventoryEntries 声明如下(其他 2 个线程也是如此):

public static volatile InventoryEntries

现在由于某种原因,windows窗体只显示了使用该RunThread()函数打开窗口的线程的变量。例如,如果线程 1 启动窗口,则只会显示该线程的变量,对于线程 2 和 3,它将全部为 0。它需要能够从所有 3 个线程中读取变量,与哪个线程无关启动了窗口。

谢谢你。

- - - - - - - - -编辑 - - - - - - - - - -

让我向您展示代码内部发生的事情的一个简短示例。这是 Manager1 的示例,假设另外 2 个经理在做基本相同的事情......

using System.Windows.Forms;
using System.Threading;

namespace Manager
{
    public class Manager1 : Manager
    {
        public static volatile int InventoryEntriesOne = 123;


        public override bool OnSomeEvent()
        {
            InventoryEntriesOne = 555;
        }

        public override bool OnSomeOtherEvent()
        {
            RunThread();
        }

        public void RunThread()
        {
            Thread thread = new Thread(new ThreadStart(RunForm));
            thread.Name = "StatusForm";
            thread.Start();
        }
        public void RunForm()
        {
            Application.Run(new StatusForm());
        }
    }
}

如您所见,Manager 正在打开一个 windows 窗体,现在该窗体中发生的情况是:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Manager
{
    public partial class StatusForm : Form
    {
        Timer refreshTimer = new Timer();

        public StatusForm()
        {
            InitializeComponent();

            PlotData();

            refreshTimer.Interval = 5000;  //5 seconds in milliseconds  
            refreshTimer.Tick += new EventHandler(refreshTimer_Tick);
            refreshTimer.Start();
        }

        void refreshTimer_Tick(object sender, EventArgs e)
        {
            PlotData();
        }

        public void PlotData()
        {
            label1.Text = Manager1.InventoryEntriesOne.ToString();

            label2.Text = Manager2.InventoryEntriesTwo.ToString();

            label3.Text = Manager3.InventoryEntriesThree.ToString();
        }
    }
}

我希望你们现在能理解这个问题。

4

2 回答 2

1

为您的解决方案尝试不同的组织:

  1. 只有 1 个 UI 线程,管理所有表单/窗口以及与用户的交互。
  2. 让上面的 UI 线程(根据需要创建并)将工作委托给后台线程。
  3. 如果线程启动确实是一个可衡量的性能问题(我不买这个先验但它可能发生)然后让 Manager 表单的每个实例缓存对其私有后台线程的引用。
  4. 当后台线程完成工作并需要更新分配给他们的 Manager 表单时,让他们使用Invoke()
于 2013-08-16T19:08:04.593 回答
0

在 Program.cs 上定义 InventoryEntries

于 2013-08-16T19:20:46.160 回答