【发布时间】:2010-08-31 08:37:26
【问题描述】:
如果需要很长时间,如何停止在线程中执行代码。我有几个线程一直在工作,但是在线程中的代码执行时间过长并且应用程序停止响应之后。
是否有可能如果代码在 30 秒内未执行,线程将停止执行它并转到下一个代码...所以应用程序仍将处于活动状态并且不会停止响应。我正在使用 C# .net 3.5
【问题讨论】:
标签: c#
如果需要很长时间,如何停止在线程中执行代码。我有几个线程一直在工作,但是在线程中的代码执行时间过长并且应用程序停止响应之后。
是否有可能如果代码在 30 秒内未执行,线程将停止执行它并转到下一个代码...所以应用程序仍将处于活动状态并且不会停止响应。我正在使用 C# .net 3.5
【问题讨论】:
标签: c#
我在这里的回答与我发布的here类似。
您可以通过在您的工作线程上等待监控线程指定的时间量来执行此操作,然后如果工作线程尚未完成,则强制终止该工作线程。请参阅下面的示例代码。
然而,一般来说,使用Thread.Abort 强行终止线程并不是一个好主意,因为目标线程不一定处于已知状态,并且可能具有对可能未释放的资源的打开句柄。使用Thread.Abort 是code smell。
更简洁的方法是更改工作线程来管理自己的生命周期。工作线程可以检查它在众所周知的检查点执行了多长时间,然后在超过某个限制时停止。这种方法的缺点是可能需要许多检查点分散在线程正在执行的实际工作中。此外,通过在检查点之间进行过多计算,工作线程很容易超过限制。
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);
}
}
【讨论】: