【问题标题】:After click stop loop button, can't Start again单击停止循环按钮后,无法重新开始
【发布时间】:2018-09-14 14:26:53
【问题描述】:

我按照前面声明中的建议使用了 backgroundworker,它可以工作。但是我有一个新问题,就是按下Stop按钮后,线程无法重新启动,必须​​点击2次

private bool _stopLoop;

private void button1_Click(object sender, EventArgs e)
{
    this.BW_PING.RunWorkerAsync();
    this.btPing.Enabled = false;
    _stopLoop = false;
}

private void Ping(bool Type)
{
    for (int i = 0; i < 100000 && !_stopLoop; ++i)
    {
        using (Ping p = new Ping())
        {
            Ping pingClass = new Ping();
            PingReply pingReply = pingClass.Send(tbUrl.Text);
            lbPing.Text = ("Ping - " + pingReply.RoundtripTime.ToString() + " Ms");
        }
    }
}

private void btStop_Click(object sender, EventArgs e)
{
    _stopLoop = true;
    this.btPing.Enabled = true;
    lbPing.Text = ("Ping Stoped");
}

private void BW_PING_DoWork(object sender, DoWorkEventArgs e)
{
    BackgroundWorker bw = sender as BackgroundWorker;
    Ping(true);
}

谁能帮帮我?

【问题讨论】:

  • _stopLoop = false;将此行放在button1_Click函数的开头
  • as suggested in the previous Statement, but I have a new problem - 你在说什么?
  • 您的代码似乎不完整... - 您永远不会停止后台工作程序,但在每个按钮单击时您都试图再次运行它 - 出于某种原因,您将 sender 转换为 BW_PING_DoWork 但从不使用那 - 我们是在玩拼图,我们应该填补空白吗?还是我错过了什么?
  • 是否意味着我只需要阻止后台工作人员?
  • 问题只包含部分问题。尝试给minimal reproducible example。不相关的提示:您不需要将要分配给 Text 属性的任何值括起来。

标签: c#


【解决方案1】:

这段代码有很多问题,例如为什么Ping(bool Type)方法需要一个参数,即使它没有在方法中使用?

正如 Hameed Syed 在 cmets 中指出的那样,最简单的解决方案是,将 _stopLoop = false; 放在 button1_Click 方法的开头。但可能值得更多地重做整个事情

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-28
    • 2014-01-21
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多