C# 如何利用定时器实现实时运行和快速刷新
我有使用对象标签和面板刷新网络的脚本,但在脚本中使用带有“for”的循环模式。我想实时刷新1秒或5秒,但因为使用“for”会使此过程需要更多时间,并卡住屏幕。如何使解决方案更快、更实时? 谢谢C# 如何利用定时器实现实时运行和快速刷新,c#,timer,C#,Timer,我有使用对象标签和面板刷新网络的脚本,但在脚本中使用带有“for”的循环模式。我想实时刷新1秒或5秒,但因为使用“for”会使此过程需要更多时间,并卡住屏幕。如何使解决方案更快、更实时? 谢谢 publicposping() { 初始化组件(); RefreshPOS.Tick+=新事件处理程序(CheckPOSUG); RefreshPOS.Start(); } 私有void CheckPOSUG(对象发送方,事件参数e) { Panel[]panelUG=新面板[]{pnlPOSUG1、pn
publicposping()
{
初始化组件();
RefreshPOS.Tick+=新事件处理程序(CheckPOSUG);
RefreshPOS.Start();
}
私有void CheckPOSUG(对象发送方,事件参数e)
{
Panel[]panelUG=新面板[]{pnlPOSUG1、pnlPOSUG2、pnlPOSUG3、pnlPOSUG4、pnlPOSUG5、pnlPOSUG6、pnlPOSUG7、pnlPOSUG8};
标签[]lablug=新标签[]{lblUG1、lblUG2、lblUG3、lblUG4、lblUG5、lblUG6、lblUG7、lblUG8};
标签[]lblSpdUG=新标签[]{lblSpdUG1、lblSpdUG2、lblSpdUG3、lblSpdUG4、lblSpdUG5、lblSpdUG6、lblSpdUG7、lblSpdUG8};
对于(int x=0;x<8;x++)
{
字符串IP=“192.168.135.1”+(x+1).ToString();
var ping=新ping();
var reply=ping.Send(IP,10*1000);
LabelUG[x].Text=“POSBMS10”+x.ToString();
if(reply.Status==IPStatus.Success)
{
lblSpdUG[x].Text=reply.RoundtripTime.ToString()+“”+“ms”;
panelUG[x].BackColor=Color.FromName(“石灰”);
}
其他的
{
lblSpdUG[x].Text=“非约束条件”;
panelUG[x].BackColor=Color.FromName(“ButtonHighlight”);
}
}
}
如果没有,很难确定如何最好地回答您的问题。但看起来您正在尝试ping八个不同的服务器,它们由表单中的八组控件表示
如果这是正确的,那么我同意评论员Hans Passant的观点,即您应该使用SendPingAsync()
方法。这将允许您异步执行ping,而不阻塞UI线程,以便您的程序能够保持响应
因为您要处理八个不同的服务器,所以我认为您应该异步执行八个ping。为了实现这一点,我将稍微重构代码,将特定于服务器的循环体放入一个单独的方法中,以便每个实例都可以并发运行
以这种方式实现它将如下所示:
private async void CheckPOSUG(object sender, EventArgs e)
{
Panel[] panelUG = new Panel[]{pnlPOSUG1,pnlPOSUG2,pnlPOSUG3,pnlPOSUG4,pnlPOSUG5,pnlPOSUG6,pnlPOSUG7,pnlPOSUG8};
Label[] LabelUG = new Label[]{lblUG1,lblUG2,lblUG3,lblUG4,lblUG5,lblUG6,lblUG7,lblUG8};
Label[] lblSpdUG = new Label[] { lblSpdUG1, lblSpdUG2, lblSpdUG3, lblSpdUG4, lblSpdUG5, lblSpdUG6, lblSpdUG7, lblSpdUG8 };
Task[] tasks = new Task[8];
for (int x = 0; x < 8; x++)
{
tasks[x] = PingServer(x, panelUG[x], LabelUG[x], lblSpdUG[x]);
}
try
{
await Task.WhenAll(tasks);
}
catch (Exception e)
{
// handle as appropriate, e.g. log and exit program,
// report expected, non-fatal exceptions, etc.
}
}
async Task PingServer(int index, Panel panel, Label ugLabel, Label spdLabel)
{
// NOTE: String concatenation will automatically convert
// non-string operands by calling calling ToString()
string IP = "192.168.135.1" + (index + 1);
var ping = new Ping();
var reply = await ping.SendPingAsync(IP, 10 * 1000);
ugLabel.Text = "POSBMS10" + x;
if (reply.Status == IPStatus.Success)
{
spdLabel.Text = reply.RoundtripTime + " ms";
// The Color struct already has named properties for known colors,
// so no need to pass a string to look Lime up.
panel.BackColor = Color.Lime;
}
else
{
spdLabel.Text = "Nonaktif";
panel.BackColor = Color.FromName("ButtonHighlight");
}
}
private async void CheckPOSUG(对象发送方,事件参数e)
{
Panel[]panelUG=新面板[]{pnlPOSUG1、pnlPOSUG2、pnlPOSUG3、pnlPOSUG4、pnlPOSUG5、pnlPOSUG6、pnlPOSUG7、pnlPOSUG8};
标签[]lablug=新标签[]{lblUG1、lblUG2、lblUG3、lblUG4、lblUG5、lblUG6、lblUG7、lblUG8};
标签[]lblSpdUG=新标签[]{lblSpdUG1、lblSpdUG2、lblSpdUG3、lblSpdUG4、lblSpdUG5、lblSpdUG6、lblSpdUG7、lblSpdUG8};
任务[]任务=新任务[8];
对于(int x=0;x<8;x++)
{
tasks[x]=PingServer(x,panelUG[x],LabelUG[x],lblSpdUG[x]);
}
尝试
{
等待任务。何时(任务);
}
捕获(例外e)
{
//适当处理,例如记录和退出程序,
//报告预期的非致命异常等。
}
}
异步任务PingServer(int索引、面板面板、标签ugLabel、标签spdLabel)
{
//注意:字符串连接将自动转换为
//通过调用ToString()实现非字符串操作数
字符串IP=“192.168.135.1”+(索引+1);
var ping=新ping();
var reply=wait ping.SendPingAsync(IP,10*1000);
ugLabel.Text=“POSBMS10”+x;
if(reply.Status==IPStatus.Success)
{
spdlab.Text=reply.RoundtripTime+“ms”;
//颜色结构已具有已知颜色的命名属性,
//所以不需要传递字符串来查找。
panel.BackColor=Color.lame;
}
其他的
{
spdLabel.Text=“Nonaktif”;
panel.BackColor=Color.FromName(“按钮高光”);
}
}
您不能使用此代码。使用Ping.SendAsync()或在具有BackgroundWorker或Task class.Right的工作线程中运行此命令。现在我习惯了。谢谢@Hanspassant谢谢你的提问,这个工作就像背景工作者一样,我现在才知道。工作很好,非常感谢:)
private async void CheckPOSUG(object sender, EventArgs e)
{
Panel[] panelUG = new Panel[]{pnlPOSUG1,pnlPOSUG2,pnlPOSUG3,pnlPOSUG4,pnlPOSUG5,pnlPOSUG6,pnlPOSUG7,pnlPOSUG8};
Label[] LabelUG = new Label[]{lblUG1,lblUG2,lblUG3,lblUG4,lblUG5,lblUG6,lblUG7,lblUG8};
Label[] lblSpdUG = new Label[] { lblSpdUG1, lblSpdUG2, lblSpdUG3, lblSpdUG4, lblSpdUG5, lblSpdUG6, lblSpdUG7, lblSpdUG8 };
Task[] tasks = new Task[8];
for (int x = 0; x < 8; x++)
{
tasks[x] = PingServer(x, panelUG[x], LabelUG[x], lblSpdUG[x]);
}
try
{
await Task.WhenAll(tasks);
}
catch (Exception e)
{
// handle as appropriate, e.g. log and exit program,
// report expected, non-fatal exceptions, etc.
}
}
async Task PingServer(int index, Panel panel, Label ugLabel, Label spdLabel)
{
// NOTE: String concatenation will automatically convert
// non-string operands by calling calling ToString()
string IP = "192.168.135.1" + (index + 1);
var ping = new Ping();
var reply = await ping.SendPingAsync(IP, 10 * 1000);
ugLabel.Text = "POSBMS10" + x;
if (reply.Status == IPStatus.Success)
{
spdLabel.Text = reply.RoundtripTime + " ms";
// The Color struct already has named properties for known colors,
// so no need to pass a string to look Lime up.
panel.BackColor = Color.Lime;
}
else
{
spdLabel.Text = "Nonaktif";
panel.BackColor = Color.FromName("ButtonHighlight");
}
}