C#多线程 创建子窗体

wj7rrp98 2018-03-02 08:12:23
这是我其中一段代码,我现在想每个新建的窗体都单独开一个线程,同时新建的窗体能够传入一个Tag,这里的标签是aControllerInfo,我现在能够做到每个新建的窗体都单独在一个线程里面,但是不能传入Tag,我该如何做?
原码
private void skinButton1_Click(object sender, EventArgs e)
{
//Thread th = new Thread(Set);
////th.IsBackground = true;
//th.Start();
int i = 1;//窗口变量
if (skinListView1.CheckedItems.Count <= 0)
{
MessageBox.Show("请选择需要监控的控制器!");
}
else
{
foreach (ListViewItem item in skinListView1.Items)
{
if (item.Checked == true)
{
var monForm = new MonForm();
//添加一个 监视窗口 来提高用户的辨识度
if (i <= skinListView1.CheckedItems.Count)
{
if (item.Tag is ControllerInfo)
{
ControllerInfo aControllerInfo = item.Tag as ControllerInfo;
monForm.Text = "监视" + " : " + i + " " + "IP地址" + " : " + aControllerInfo.IPAddress.ToString() + " " + "控制系统" + " : " + aControllerInfo.SystemName.ToString();
monForm.Tag = aControllerInfo;
}
i++;
}
monForm.MdiParent = this;
//monForm.WindowState = FormWindowState.Maximized;
monForm.Show();
LayoutMdi(MdiLayout.ArrangeIcons);
}
}
//this.LayoutMdi(MdiLayout.Cascade);
//this.LayoutMdi(MdiLayout.TileHorizontal);
this.skinListView1.Visible = false;
this.skinSplitContainer1.Visible = false;
}
}
实现新建窗体单独在一个线程中,无法传入Tag
public void Set()
{
var mi = new MethodInvoker(this.ShowForm);
this.BeginInvoke(mi);
}
public void ShowForm()
{
var monForm = new MonForm();
monForm.MdiParent = this;
monForm.Show();
}
//线程
Thread th;
private void skinButton1_Click(object sender, EventArgs e)
{
//隐藏 skinListView1
skinListView1.Visible = false;
//隐藏skinSplitContainer1
int i = 1;
if (skinListView1.CheckedItems.Count <= 0)
{
MessageBox.Show("请选择需要监控的控制器!");
}
else
{
foreach (ListViewItem item in skinListView1.Items)
{
th = new Thread(Set);
//后台线程
th.IsBackground = true;
//线程准备就绪
th.Start();
//添加一个 监视窗口 来提高用户的辨识度
if (i <= skinListView1.CheckedItems.Count)
{
if (item.Tag is ControllerInfo)
{
ControllerInfo aControllerInfo = item.Tag as ControllerInfo;
//monForm.Text = "监视" + " : " + i + " " + "IP地址" + " : " + aControllerInfo.IPAddress.ToString() + " " + "控制系统" + " : " + aControllerInfo.SystemName.ToString();
//monForm.Tag = aControllerInfo;
//monForm.Text = "监视" + " : " + i + " " + "IP地址" + " : " + aControllerInfo.IPAddress.ToString() + " " + "控制系统" + " : " + aControllerInfo.SystemName.ToString();
//monForm.Tag = aControllerInfo;
}
i++;
}

}
}
}
...全文
604 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2018-03-03
  • 打赏
  • 举报
回复
放在invoke里调用
  • 打赏
  • 举报
回复
什么意思?“实现每一个窗体都在一个线程里”这是什么意思? 窗体是一个独立的对象,你刻意地在子线程中 new 这个对象干什么? 并且 .net 编程机制要求你在主线程中来操作控件,这样避免出现各种线程冲突。因此你正常地 new 一个窗体对象实例就行了,滥用县城更是毫无意义。 最后,Tag 是个老掉牙的特性,是差不多1990年代初的微软 vb 特性的遗产。如果你要为窗体设计属性,那么你自定义一个或者任意多个明确的自定义属性更加清晰更加专业,例如写
public TypeA Info{get;set;}
用不着这种几十年前的弱类型无啥功能的 Tag。

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧