eC#多线程控制UI
本文关键字:UI 控制 多线程 eC# | 更新日期: 2023-09-27 18:22:03
此函数在其他线程中运行。我想控制一些复选框。复选框在ArrayList中我不知道为什么不起作用
private void aktu_pin()
{
NetworkStream ns = server.GetStream();
int recv;
ControlUi ui = new ControlUi(ChangeCheckbox);
data = new byte[1024];
while (true)
{
recv = ns.Read(data, 0, data.Length);
if ((data[0] == 0) && (data[1] == 0) && (data[2] == 0) && (data[3] == 0))
{
for (int i = 4; i < data.Length; i++)
{
if (zuweisung(i - 4) >= 0)
{
CheckBox c = (CheckBox)checkboxes[zuweisung(i - 4) - 1];
bool t = data[i] == 1 ? true : false;
if (c.InvokeRequired)
{
Invoke(new MethodInvoker(delegate { c.Checked = t; }));
}
}
}
}
}
}
这是我生成复选框的代码:
for (int j = 1; j <= 20; j++)
{
for (int i = 1; i <= 2; i++)
{
CheckBox pins = new CheckBox();
checkboxes.Add(pins);
pins.Appearance = Appearance.Button;
pins.Font = new Font("Microsoft Sans Serif", 5F);
pins.Location = Location = new Point(j * 20, 502 - i * 20);
pins.Name = "pin" + ((j) + (20 * (i - 1))).ToString();
pins.MouseHover += new EventHandler(this.pin_MouseHover);
pins.Size = new Size(15, 15);
pins.TabIndex = 12;
pins.Text = " ";
pins.BringToFront();
pins.UseVisualStyleBackColor = true;
Controls.Add(pins);
pins.Click += new EventHandler(pinsclick);
}
}
感谢您的帮助
在不需要调用的情况下,您键入的"InvokeRequired"模式会错过else
部分:
if (c.InvokeRequired)
{
c.Invoke(new MethodInvoker(delegate { c.Checked = t; }));
}
else
{
c.Checked = t;
}
编辑
while (true)
相当暴力。我怀疑这段代码发送了UI线程无法继续的UI调用。你有可能把它放在计时器里吗?
你的问题与另一个问题非常相似。
很难猜测所提供的信息可能有什么问题,但一个问题可能是调用invoke方法(可能是表单)的UI控件,并且复选框不是在同一个线程上构建的。如果是这个问题,调用c.Invoke(…)而不是Invoke可以解决这个问题。类似:
if (c.InvokeRequired)
{
c.Invoke(new MethodInvoker(delegate { c.Checked = t; }));
}