[英]c# run windows form from console and run both of them
有一个控制台应用程序可模拟路由器功能(数据包切换等)。 我制作了一个简单的Windows窗体,该窗体应显示每个路由器的套接字使用了多少。 每个套接字具有不同的容量,并且每个“已连接”到套接字的表格都应显示仍有多少容量。
到目前为止,我的代码:
static void Main(string[] args)
{
//get number of router's sockets
args = Environment.GetCommandLineArgs();
int socketnumber = Convert.ToInt32(args[2]);
//get sockets' capacity
int[] array = new int[socketnumber];
for (int i = 0; i < socketnumber; i++)
{
array[i] = Convert.ToInt32(args[3 + i]);
}
现在,LRM是一个WinForm,它显示每个套接字的状态(或更准确地说,链接附加到套接字的状态),因此我对其进行初始化并为其指定参数。
LRM[] lrm = new LRM[socketnumber];
for (int i = 0; i < socketnumber; i++)
{
lrm[i] = new LRM();
lrm[i].Show();
a++;
}
for (int i = 0; i < socketnumber; i++)
{
Console.WriteLine(array[i]);
lrm[i].capacity = array[i];
lrm[i].available = array[i];
lrm[i].WriteCapacity(lrm[i].capacity);
lrm[i].WriteAvailable(lrm[i].available);
}
路由器调用WriteCapacity和WriteAvailable来更新LRM上的值的方法,如下所示:
public void WriteAvailable(int ava)
{
MethodInvoker mi = delegate ()
{
textBox2.Text = ava.ToString();
};
Invoke(mi);
}
现在,我有当前的问题:
1)当Windows窗体的数量发生变化(由命令行参数设置)时,从控制台运行多个Windows窗体并维护其功能(同时执行所有功能)
2)更新LRM值。 当使用show()方法时,它仅显示表单,它不提供任何值,并且在表单停止响应后不久,出现Windows错误。 当使用Application.Run()方法时,一种形式可以很好地运行,但是其他LRM和路由器的控制台都无法工作。
我感谢亚历山大·彼得罗夫(Alexander Petrov)的回答,但我找到了解决问题的方法。
我尝试了线程方法。 首先,我将大多数变量设为静态:
static int[] array;
static LRM[] lrm;
static int port;
然后我做了一个将作为线程启动方法的方法
private static void startLRM(int i)
{
Console.WriteLine(i);
lrm[i].Text = "LRM R" + ((port / 10) - 120).ToString() + " S" + a.ToString();
a++;
Console.WriteLine(array[i]);
lrm[i].capacity = array[i];
lrm[i].available = array[i];
lrm[i].WriteCapacity(lrm[i].capacity);
lrm[i].WriteAvailable(lrm[i].available);
lrm[i].ShowDialog();
}
然后,在Main()方法中,我为链接资源管理器分配了内存,在for循环中,我制作了所需数量的LRM。
lrm = new LRM[socketnumber];
for (int i = 0; i < socketnumber; i++)
{
lrm[i] = new LRM();
Thread thread = new Thread(() => startLRM(i));
thread.Start();
Thread.Sleep(150);
}
睡觉实际上是必要的,因为由于未知的原因,当我不在时会出现错误。
最终,我得到了我需要的-一个控制台应用程序,它显示了正在发生的事情,以及几个以漂亮的方式显示一些值的Windows窗体。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.