如何中止长时间运行的方法
本文关键字:方法 运行 长时间 何中止 | 更新日期: 2023-09-27 18:36:02
我有一个长时间运行的方法,我想在其中添加超时。这样做可行吗?像这样:
AbortWaitSeconds(20)
{
this.LongRunningMethod();
}
当达到 20 秒时,该方法将中止。该方法没有循环,我没有对该方法的控制/代码。
试试这个
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);
}
}
你可以看到它
请参阅我对这个问题的回答以获取通用解决方案。
在后台线程中执行计算,然后等待线程完成。要中止计算,请使用 Thread.Abort()
,这将在计算线程中引发ThreadAbortException
。
只有当您
有一个代码点来引入检查和退出时,才能中止来自同一线程的长时间运行的进程。这是因为 - 显然 - 线程很忙,所以它无法处理检查以中止自身。因此,您的示例仅包含对"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
}
由于您无法控制该代码,因此我认为正确的方法是使用WaitHandles和ThreadPool运行该代码:
WaitHandle waitHandle = new AutoResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback(<long running task delegate>), waitHandle);
WaitHandle.WaitAll(new[]{ waitHandle }, <timeout>);
在这里,您可以找到有关 WaitHandle 工作原理的更多信息。