3

Thread.Suspend()ご存知のように、メソッドは廃止されました。ボタンクリックイベントが発生したらすぐにスレッドを一時停止したい。私はThread.Suspend()を使用しましたが、これは完璧に機能しますが、Thread.Suspend()メソッドを使用することは、タスクを一時停止するのに適したメソッドではないことを誰もが示唆しています。フラグを使用してタスクを一時停止しましたが、ボタンクリックイベントが発生するたびに、タスクを終了するのを待つ必要があります。Thread.IsAliveフラグを使用してスレッドが終了するのを待ちましたが、このメソッドはフォームをフリーズします。

void ButtonClickEvent(object sender, ButtonClickEventArgs e)
{
    TheadExitFlag = false;

    if(MyThread != null)
    {
        while(MyThread.IsAlive);
        //MyThread.Suspend();
    }
}

void MyTask(void)
{
    while(TheadExitFlag)
    {
        // some process
        Thread.Sleep(5000);
    }
}

スレッドをすぐに中断するにはどうすればよいですか?

4

3 に答える 3

4

を使用しManualResetEventて、実行状態とアイドル状態を切り替えます。

ManualResetEvent run = new ManualResetEvent(true);

void ResumeButton_Click(object sender, ButtonClickEventArgs e)
{
  run.Set();
  PauseButton.Enabled = true;
  ResumeButton.Enabled = false;
}

void PauseButton_Click(object sender, ButtonClickEventArgs e)
{
  run.Reset();
  PauseButton.Enabled = false;
  ResumeButton.Enabled = true;
}

void MyTask(void)
{
    while (run.WaitOne())  // Wait for the run signal.
    {
      // Do work here.
    }
}
于 2012-04-18T15:12:37.203 に答える
4

同じ機能を持つ代替手段はありません、AFAIK。OSの問題がSuspend()言語/ライブラリ内で回避できるかどうかはわかりませんが、そうする試みはなされていないため、難しすぎるか、あるいはかなり不可能でさえあるかもしれません。

このような代替手段が存在するまでは、サスペンドフラグをポーリングしてから、同期オブジェクトで「再開」信号を待機することになります。これにはAutoResetEventを使用しました。

于 2012-04-18T09:53:16.603 に答える
0

この問題の大まかな解決策は、https: //stackoverflow.com/a/45786529/3013473にAspectJとwait/notifyを使用してあります。

于 2017-08-21T07:59:40.023 に答える