【问题标题】:C#: Measure time taken and exit function when time elapsedC#:测量所用时间并在时间过去时退出函数
【发布时间】:2012-06-11 19:43:15
【问题描述】:

我想运行一个函数 (funcA) 并使用另一个函数 (timerFunc) 作为计时器。如果正在运行的函数(funcA)已经运行了 10 秒,我想使用定时器函数(timerFunc)退出它。这可能吗?基本上我正在尝试做的事情:

void funcA() {
    // check event 1
    // check event 2
    // check event 3
    // time reaches max here! --exit--
    //check event 4
}

如果不是,那么处理这种情况的最佳方法是什么?我考虑过使用秒表,但我不确定这是否是最好的做法,主要是因为我不知道在什么事件之后会达到超时。

【问题讨论】:

  • 在 funcA 中是否有一个设定点,如果你要退出,你会检查它,还是只是想停止执行,无论你在 funcA 中的哪个位置?
  • 马尔科姆,感谢您的回复。无论我在 funcA 的哪个位置,我都想退出函数。
  • 如果您无论如何都想退出,那么我在下面发布的线程中止解决方案将执行此操作,但请注意,这可能对稳定性和性能非常危险,具体取决于您在该功能中所做的事情

标签: c# time timeout measure


【解决方案1】:
Thread t = new Thread(LongProcess);
t.Start();
if (t.Join(10 * 1000) == false)
{
    t.Abort();
}
//You are here in at most 10 seconds


void LongProcess()
{
    try
    {
        Console.WriteLine("Start");
        Thread.Sleep(60 * 1000);
        Console.WriteLine("End");
    }
    catch (ThreadAbortException)
    {
        Console.WriteLine("Aborted");
    }
}

【讨论】:

    【解决方案2】:

    您可以将所有事件放入 Action 数组或其他类型的委托中,然后遍历列表并在适当的时间退出。

    或者,在后台线程或任务或其他一些线程机制中运行所有事件,并在到达适当的时间时中止/退出线程。硬中止是一个糟糕的选择,因为它可能导致泄漏或死锁,但您可以在适当的时候检查 CancellationToken 或其他东西。

    【讨论】:

    • 谢谢大家的回答。我使用上面 Jason 的建议找到了解决方案。
    【解决方案3】:

    我会创建一个列表,然后非常快:

    class Program
    {
        static private bool stop = false;
        static void Main(string[] args)
        {
            Timer tim = new Timer(10000);
            tim.Elapsed += new ElapsedEventHandler(tim_Elapsed);
            tim.Start();
    
            int eventIndex = 0;
            foreach(Event ev in EventList)
            {
               //Check ev
                // see if the bool was set to true
                if (stop)
                    break;
            }
        }
    
        static void tim_Elapsed(object sender, ElapsedEventArgs e)
        {
            stop = true;
        }
    }
    

    这应该适用于一个简单的场景。如果它更复杂,我们可能需要更多细节。

    【讨论】:

    • 根据他对 FuncA 的描述,我认为他实际上指的是函数而不是事件
    • 嗨,Jason,我以为他正在检查 FuncA 中的事件列表。可能需要澄清一下。
    猜你喜欢
    • 1970-01-01
    • 2018-06-09
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2012-10-20
    • 2011-07-25
    • 2023-03-09
    相关资源
    最近更新 更多