【问题标题】:How to timeout execution of function如何超时执行功能
【发布时间】:2019-05-24 10:55:09
【问题描述】:

我想限制函数执行的时间。如果花费的时间太长,它应该停止执行(如果需要抛出异常)。 我之所以想要它,是因为有时 lock 内的代码需要永远,并且所有想要访问 lock 语句的线程都无法访问它。

例子:

lock(objLock){
   DoWork();
}

所以我想限制函数 DoWork() 的执行时间,以防止其他线程永远等待进入锁。它不能帮助我限制其他线程应该等待多长时间才能进入。

【问题讨论】:

  • 也许您需要注意“永远耗时”的代码,因为这似乎不是精心设计的代码的正常行为。

标签: c# timeout locking


【解决方案1】:

使用另一个线程完成工作,当前线程作为监视器:

lock(objLock){
    Thread workerThread = new Thread(DoWork);
    workerThread.Start();

    TimeSpan timeout = TimeSpan.FromSeconds(30);
    bool finished = workerThread.Join(timeout);
    if (!finished) workerThread.Abort();
}

【讨论】:

    【解决方案2】:

    您可以手动添加如下:

    DateTime dt = DateTime.Now;
    while(Datetime.Now - dt > Atimespan)
    {Do some work}
    

    或者你可以在循环中检查时间

    DateTime dt = DateTime.Now;
    lock(objLock){
       DoWork();
       if(DateTime.Now - dt > SomeTimeSpan) break;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-09-03
      • 1970-01-01
      • 2012-10-15
      • 2019-01-21
      • 1970-01-01
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多