1

我正在开发一个 C# winform 应用程序,该应用程序不断导航 webbrowser 控件中的一些链接并处理该网页的数据。我需要在表单上为暂停和恢复提供两个按钮。

单击按钮时,整个应用程序应该暂停处理,然后单击恢复按钮,它应该重新启动。

因此,要暂停应用程序,单击暂停按钮后,我通过以下代码使线程无限休眠。

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

但是这段代码无法让用户点击表单上的 Resume Button 来恢复应用程序。此外,我没有得到一段完美的代码来通过单击“恢复”按钮恢复应用程序。

谁能给我这个问题的正确解决方案?

4

2 回答 2

1

Thread.Sleep方法将代码执行到进程调度程序,并且在指定时间过去之前不会将其取回。因此,您不能让睡眠线程自行唤醒。你甚至不能让一个工作线程唤醒另一个睡眠线程(据我所知)。

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

  • 分离数据处理代码到分离,worker,method
  • 在单独的线程中运行工作方法
  • 在 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);
        }
    }
}

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

于 2012-10-10T07:43:33.870 回答
0

如果你让你的 UI 线程无限期地休眠,你将无限期地杀死你的 UI。不要那样做。

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

于 2012-10-10T07:30:15.633 回答