【问题标题】:Quick while stopping停车时快速
【发布时间】:2011-11-25 09:28:49
【问题描述】:

我有这个代码:

private STOP = false;

public void Start()
{
     while(!STOP)
     {
          //do some work
          Thread.Sleep(15000);
     }
}

public void Stop()
{
     STOP = true;
}

但使用此代码有时需要等待 15 秒,如何快速停止此循环或可能需要使用其他代码?

谢谢!

【问题讨论】:

  • 这将在发布版本中永远挂起,STOP 需要是可变的。是的,ManualResetEvent 是最好的。

标签: c# multithreading while-loop


【解决方案1】:

类似的东西:

private System.Threading.ManualResetEvent STOP = new System.Threading.ManualResetEvent(false);

public void Start()
{
     while(true)
     {
          //do some work
          if(STOP.WaitOne(15000))
            break;
     }
}

public void Stop()
{
    STOP.Set();
}

【讨论】:

  • 顺便说一下,您可以将其简化为while (!STOP.WaitOne(15000)) {}。如果等待超时,WaitOne 返回 false
  • 除非重复他的逻辑,否则它将是do { ...} while(!STOP.WaitOne(15000));
【解决方案2】:

每当你发现自己写了一个循环来做某事,然后等待一段相对较长的时间(甚至 秒是很长的时间!)再做一次,你应该消除循环并使用计时器。比如你上面的代码可以重写:

System.Threading.Timer MyTimer;

public void Start()
{
    MyTimer = new Timer((s) =>
        {
            DoSomeWork();
        }, null, 15000, 15000);
}

计时器将每 15 秒触发一次以完成工作。当需要关闭程序时,只需丢弃计时器即可。

public void Stop()
{
    MyTimer.Dispose();
}

这将比使用大部分时间都在休眠但仍在消耗系统资源的单独线程更有效。

【讨论】:

    【解决方案3】:

    使用 ManualResetEvent.WaitOne 超时。

    manualResetEvent.WaitOne(timeout)
    

    设置事件唤醒,否则超时唤醒。

    看到这个相关的question.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-07
      • 2013-05-06
      • 2021-06-30
      • 1970-01-01
      • 2021-05-22
      • 2021-01-09
      • 2019-02-02
      • 2020-08-17
      相关资源
      最近更新 更多