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);
            }
        }

感谢您的帮助

eC#多线程控制UI

在不需要调用的情况下,您键入的"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; }));
}