2

我有一个长时间运行的方法,我想在其中添加超时。这样做可行吗?就像是:

AbortWaitSeconds(20)
{
    this.LongRunningMethod();
}

当达到 20 秒时,该方法将被中止。该方法没有循环,我没有对该方法的控制/代码。

4

5 回答 5

2

尝试这个

class Program
{
    static void Main(string[] args)
    {
        if (RunWithTimeout(LongRunningOperation, TimeSpan.FromMilliseconds(3000)))
        {
            Console.WriteLine("Worker thread finished.");
        }
        else
        {
            Console.WriteLine("Worker thread was aborted.");
        }
    }

    static bool RunWithTimeout(ThreadStart threadStart, TimeSpan timeout)
    {
        Thread workerThread = new Thread(threadStart);

        workerThread.Start();

        bool finished = workerThread.Join(timeout);
        if (!finished)
            workerThread.Abort();

        return finished;
    }

    static void LongRunningOperation()
    {
        Thread.Sleep(5000);
    }
}

你可以看到

于 2012-05-31T05:46:48.880 回答
2

有关通用解决方案,请参阅我对这个问题的回答。

于 2012-05-31T05:48:54.687 回答
1

由于您无法控制该代码,我相信正确的方法是使用 WaitHandles 和 ThreadPool 运行该代码:

WaitHandle waitHandle = new AutoResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback(<long running task delegate>), waitHandle);
WaitHandle.WaitAll(new[]{ waitHandle }, <timeout>);

在这里您可以找到有关 WaitHandle 工作原理的更多信息。

于 2012-05-31T05:52:18.383 回答
1

在后台线程中进行计算并等待线程完成。要中止计算,请使用,这将在计算线程中Thread.Abort()抛出一个。ThreadAbortException

于 2012-05-31T05:39:23.623 回答
1

如果您有一个代码点来引入检查和退出,则只能从同一线程中止长时间运行的进程。这是因为 - 显然 - 线程很忙,所以它不能处理检查以中止自己。因此,您的示例仅包含对“LongRunningMethod”的一次调用不能从同一个线程中止。您需要显示更多代码才能获得指导。

作为一般规则,长时间运行的任务最好发送到不同的线程(例如,通过 BackgroundWorker 或新线程),以便可以中止它们。

这是一种简单的方法;

private void StartThread()
{
    Thread t = new Thread(LongRunningMethod);
    t.Start();
    if (!t.Join(10000)) // give the operation 10s to complete
    {
        // the thread did not complete on its own, so we will abort it now
        t.Abort();
    }
}

private void LongRunningMethod()
{
    // do something that'll take awhile
}
于 2012-05-31T05:49:01.923 回答