1

私は、Web ブラウザー コントロール内のいくつかのリンクを継続的にナビゲートし、その Web ページのデータを処理する C# winform アプリケーションに取り組んでいます。フォームに一時停止と再開用の 2 つのボタンを用意する必要があります。

ボタンをクリックすると、アプリケーション全体が一時停止処理を取得し、その後、再開ボタンをクリックすると再び開始する必要があります。

アプリケーションを一時停止するには、一時停止ボタンをクリックすると、次のコードでスレッドを無限にスリープさせました。

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

しかし、このコードでは、ユーザーがフォームの [再開] ボタンをクリックしてアプリケーションを再開することはできません。また、再開ボタンをクリックしてアプリケーションを再開するための完璧なコードが得られません。

誰でもこの問題の正しい解決策を得ることができますか?

4

2 に答える 2

1

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);
        }
    }
}

ビジネス ニーズに応じて空欄を埋める必要があります。

于 2012-10-10T07:43:33.870 に答える
0

UIスレッドを無期限にスリープ状態にすると、UIが無期限に強制終了されます。そうしないでください。

アプリケーションには、ナビゲーションと処理を実行する時間であることを認識するメカニズムがあります。おそらく、ある種のタイマーです。タイマーの場合は、アプリケーションを一時停止したときに停止し、再開したときに再開します。それが他のメカニズムである場合は、それを停止する必要もありますが、そのメカニズムが何であるかを知らずにその方法を説明するのは困難です。

于 2012-10-10T07:30:15.633 に答える