繁体   English   中英

当应用程序处于C#winform应用程序的暂停/睡眠模式时,允许用户单击表单的按钮

[英]Allow user to click on a Button of the form when Application is in Pause/Sleep Mode in C# winform Application

我正在使用一个C#winform应用程序,该应用程序连续浏览Web浏览器控件中的某些链接并处理该网页的数据。 我需要在表单上为暂停和恢复提供两个按钮。

单击按钮后,整个应用程序应暂停处理,然后单击“继续”按钮,应重新启动。

因此,要暂停应用程序,请单击“暂停”按钮,然后通过以下代码使线程进入无限时间的睡眠状态。

private void Pause_Click(object sender, EventArgs e)
{
  System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
}

但是这段代码无法使用户单击表单上的“继续”按钮来恢复应用程序。 另外,单击“继续”按钮后,我无法获得完美的代码来恢复应用程序。

任何人都可以为我找到解决此问题的正确方法吗?

Thread.Sleep方法使代码执行到进程调度程序,并且直到指定的时间过去才将其取回。 因此,您无法使睡眠线程自行唤醒。 就我所知,您甚至无法使工作线程唤醒另一个睡眠线程。

您需要以不同的方式实现目标。

  • 分离的数据处理代码以分离工人,方法
  • 在单独的线程中运行辅助方法
  • 在UI和辅助线程之间共享状态变量。 此变量应传递有关是否应暂停执行的信号。
  • 在UI线程中,根据需要在共享变量中设置暂停信号
  • 在处理循环中,编写用于停止处理的处理程序代码

我将在下面发布一些伪代码,说明如何执行此操作:

private bool _Paused = false;
private void OnPauseClick()
{
    _Paused = true;
}
private void OnResumeClick()
{
    _Paused = false;
}
private void OnRunClick()
{
    ThreadPool.QueueUserWorkItem(new WaitCallback(WorkerMethod));
}

private void WorkerMethod(object state)
{
    ...
    while (needToDoMoreWork)
    {
        // do some work here
        ...
        // if pause requested, wait to unpause
        while (_Paused)
        {
            // Sleep for a short time and check again if paused
            Thread.Sleep(100);
        }
    }
}

您需要根据业务需要填写空白。

如果您将UI线程无限期地睡眠,则将无限期地杀死UI。 不要那样做

您的应用程序具有某种机制来知道是时候进行导航和处理了,可能是某种计时器。 如果是计时器,则在暂停应用程序时将其停止,并在恢复时再次启动它。 如果是其他机制,您也需要停止它,但是如果不知道该机制是什么,很难告诉您如何做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM