我编写了一个简单的程序来发送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);
}
}
}
}
答案 0 :(得分:0)
第this.DoubleBuffered = true
行应该有用。
似乎它不在YourProject.YourProject
类中
它应该在类中,以便可以正确实现双重缓冲。
您还应该尝试ControlStyles Enum
ControlStyles 。应该在SetStyle下实现,该类型必须为YourProject.YourProject
。
您可以在此处找到其他方法-how to stop flickering C# winforms。