簡體   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