如何避免Winforms闪烁C#

时间:2020-09-07 09:19:06

标签: c# winforms

我编写了一个简单的程序来发送ICMP请求。该程序轮询自己线程中的每个主机。问题是表格上的表格闪烁,其中显示了结果的标签和按钮。我尝试在Form中的Doublebuffered上进行设置,但这无济于事。

private void pingThreadmain(object number_thread) {            
    Ping pingSender = new Ping();            
    // поток работает, пока установлена глобальная переменная
    while (thread_ping) {                
        // замеряем время запуска пинга
        int start_ping = Environment.TickCount & Int32.MaxValue;
        // получаем таймаут из таблицы
        string timeout = "";
        Action action_timeout = () => timeout = list_timeout[(int)number_thread].Text;
        list_timeout[(int)number_thread].Invoke(action_timeout);
        // пингуем хост
        PingReply reply = pingSender.Send(list_ip[(int)number_thread].Text, Int32.Parse(timeout));
        // вычисляем время выполнения пинга
        int duration_ping = Int32.Parse(timeout) - (Environment.TickCount & Int32.MaxValue) + start_ping;
        if (reply.Status == IPStatus.Success) {
            // если хост отвечает
            // изменяем визуальные компоненты
            Action action_status = () => list_status[(int)number_thread].BackColor = Color.Green;
            list_status[(int)number_thread].Invoke(action_status);
            Action action_rtt = () => list_rtt[(int)number_thread].Text = reply.RoundtripTime.ToString();
            list_rtt[(int)number_thread].Invoke(action_rtt);
            // проверяем что таймаут паузы не отрицательный
            if (duration_ping > 0) {
                Thread.Sleep(duration_ping);
            }
        }
        else {
            // если хост не отвечает
            // изменяем визуальные компоненты 
            Action action_status = () => list_status[(int)number_thread].BackColor = Color.Red;
            list_status[(int)number_thread].Invoke(action_status);
            Action action_rtt = () => list_rtt[(int)number_thread].Text = "---";
            list_rtt[(int)number_thread].Invoke(action_rtt);
            Action action_fail = () => list_fail[(int)number_thread].Text = (Int32.Parse(list_fail[(int)number_thread].Text) + 1).ToString();
            list_fail[(int)number_thread].Invoke(action_fail);
            // выводим сообщение о недоступности хоста
            AddLog($"нет ответа от {list_ip[(int)number_thread].Text} {list_name[(int)number_thread].Text}");
            // проверяем что таймаут паузы не отрицательный
            if (duration_ping > 0) {
                Thread.Sleep(duration_ping);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

this.DoubleBuffered = true行应该有用。

似乎它不在YourProject.YourProject类中

它应该在类中,以便可以正确实现双重缓冲。

您还应该尝试ControlStyles Enum ControlStyles 。应该在SetStyle下实现,该类型必须为YourProject.YourProject

您可以在此处找到其他方法-how to stop flickering C# winforms