【问题标题】:how to check whether a button is clicked, inside another button click event in windows form application in C#如何检查一个按钮是否被点击,在C#的Windows窗体应用程序中的另一个按钮点击事件中
【发布时间】:2015-07-01 06:32:55
【问题描述】:

好吧,我在一个表单上有两个按钮,我想用第一个按钮开始数据传输并在按下第二个按钮时停止。

代码是:

private void stdaq_Click(object sender, EventArgs e)
{
    stopped = false;

    //while (stopped == false)

    if (sender == spdaq)
    {
        stopped = true;
        ///break;
        Process();
    }
    else if (sender == stdaq)
    {
        Process();
    }
}

这里 stdaq 是开始按钮,spdaq 是停止按钮,进程函数是我正在实现的一个函数,并且使用 bool 类型的停止变量,我正在进程方法中实现两个不同的函数,但我想不断检查是否按下了停止按钮,但在这里我没有成功。

所以请帮助我了解如何在按下停止按钮时将值 true 传递给启动按钮本身的事件单击函数内的停止变量。

【问题讨论】:

  • 进程是某个长时间运行的方法还是每次点击都会再次运行的方法?
  • 进程是一个长时间运行的方法,你可以假设它是我在一个while循环中调用它的方法,按下停止按钮它应该会退出它
  • 那么你需要让进程在单独的线程上运行,然后定期(在安全时间)检查是否需要取消该方法
  • @Sayse,请提供一些相同的代码来帮助
  • 抱歉,我现在没有时间写完整的答案,但this, How to: Use a Background Worker, 应该会有所帮助

标签: c# .net winforms


【解决方案1】:

创建取消令牌,在按钮启动事件处理程序中启动异步任务将您的方法放入此任务中,传递对此取消令牌的引用并使用 当您稍后需要它时,它会在停止按钮事件处理程序中停止此任务。

更多信息:https://msdn.microsoft.com/en-us/library/jj155759.aspx

如何使用它的示例:

    static CancellationTokenSource cts;
    static Task t;

    private void Method()
    {
        while (!cts.IsCancellationRequested) 
        {
             // your logic here
        }
        t = null;
    }

    private void stdaq_click (object sender, EventArgs e)
    {           
       if(t != null) return;
       cts = new CancellationTokenSource();
       t = new Task(Method, cts.Token, TaskCreationOptions.None);
       t.Start();
    }

    private void spdaq_Click(object sender, EventArgs e) 
    {
       if(t != null) cts.Cancel(); 
    }

【讨论】:

  • 你真的应该更好地格式化你的代码。
  • 已更新。谢谢
  • 这将导致 Process 当前在 ui 线程上运行,因此您将永远没有机会点击 spdaq
  • @Sayse,正确的我实现了这个,这冻结了我的表单
  • 这正是我在异步任务中添加第二个选项的原因...这取决于您的“while”循环中的内容。有些操作确实会阻塞线程,有些则不会。如果您需要您的 UI 线程一直在工作,您需要启动新线程或任务
【解决方案2】:

为开始和停止按钮使用两个单独的处理程序。这使您的逻辑更易于遵循。然后做这样的事情:

private void stdaq_Click(object sender, EventArgs e) // Start
{
    Process(true);
}

private void spdaq_Click(object sender, EventArgs e) // Stop
{
    Process(false);
}

甚至更好:创建两个单独的方法 StartProcess()StopProcess()

【讨论】:

  • 感谢您的回复,但我无法修改函数过程,因为它是由某个传感器提供的,并且通过该方法过程我不断获取数据,因此使用此事件类型我想在一段时间循环中调用进程,但是一旦按下停止按钮,我希望它退出循环
猜你喜欢
  • 2013-05-09
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多