Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何利用定时器实现实时运行和快速刷新_C#_Timer - Fatal编程技术网

C# 如何利用定时器实现实时运行和快速刷新

C# 如何利用定时器实现实时运行和快速刷新,c#,timer,C#,Timer,我有使用对象标签和面板刷新网络的脚本,但在脚本中使用带有“for”的循环模式。我想实时刷新1秒或5秒,但因为使用“for”会使此过程需要更多时间,并卡住屏幕。如何使解决方案更快、更实时? 谢谢 publicposping() { 初始化组件(); RefreshPOS.Tick+=新事件处理程序(CheckPOSUG); RefreshPOS.Start(); } 私有void CheckPOSUG(对象发送方,事件参数e) { Panel[]panelUG=新面板[]{pnlPOSUG1、pn

我有使用对象标签和面板刷新网络的脚本,但在脚本中使用带有“for”的循环模式。我想实时刷新1秒或5秒,但因为使用“for”会使此过程需要更多时间,并卡住屏幕。如何使解决方案更快、更实时? 谢谢

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