天道酬勤,学无止境

如果方法花费超过 2 秒,C# 如何停止方法?(C# How to stop a method if it takes longer than 2 seconds?)

问题

以下程序将连接到网络并获取“msnbc.com”网页的html内容并打印出结果。 如果从网页获取数据的时间超过 2 秒,我希望我的方法停止工作并返回。 你能告诉我如何用一个例子来做到这一点吗?

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        gethtml();
        MessageBox.Show("End of program");
    }

    public void gethtml()
    {
        HttpWebRequest WebRequestObject = (HttpWebRequest)HttpWebRequest.Create("http://msnbc.com/");

        WebResponse Response = WebRequestObject.GetResponse();
        Stream WebStream = Response.GetResponseStream();

        StreamReader Reader = new StreamReader(WebStream);
        string webcontent = Reader.ReadToEnd();
        MessageBox.Show(webcontent);
    }
}
回答1

两秒钟对于阻止 UI来说太长了。 如果您计划在 50 毫秒或更短的时间内获得结果,您应该只阻止 UI。

阅读这篇文章,了解如何在不阻塞 UI 的情况下执行 Web 请求:

http://www.developerfusion.com/code/4654/asynchronous-httpwebrequest/

请注意,在 C# 5 中,这一切都会变得容易得多,目前它是 beta 版本。 在 C# 5 中,您可以简单地使用await运算符来异步等待任务的结果。 如果您想了解这种事情在 C# 5 中是如何工作的,请参阅:

http://msdn.microsoft.com/en-us/async

回答2

设置WebRequest对象的Timeout属性。 文档

MSDN 示例:

// Create a new WebRequest Object to the mentioned URL.
WebRequest myWebRequest=WebRequest.Create("http://www.contoso.com");
Console.WriteLine("\nThe Timeout time of the request before setting is : {0} milliseconds",myWebRequest.Timeout);

// Set the 'Timeout' property in Milliseconds.
myWebRequest.Timeout=10000;

// This request will throw a WebException if it reaches the timeout limit before it is able to fetch the resource.
WebResponse myWebResponse=myWebRequest.GetResponse();
回答3

如上所述。超时

    public void gethtml()
    {
        HttpWebRequest WebRequestObject = (HttpWebRequest)HttpWebRequest.Create("http://msnbc.com/");
        WebRequestObject.Timeout = (System.Int32)TimeSpan.FromSeconds(2).TotalMilliseconds;
        try
        {
            WebResponse Response = WebRequestObject.GetResponse();
            Stream WebStream = Response.GetResponseStream();

            StreamReader Reader = new StreamReader(WebStream);
            string webcontent = Reader.ReadToEnd();
            MessageBox.Show(webcontent);
        }
        catch (System.Net.WebException E)
        {
            MessageBox.Show("Fail");
        }
    }
回答4

您可以在 HttpWebRequest 上使用 TimeOut 属性

回答5

考虑切换到内容的异步下载。 您将停止阻塞 UI 线程,并且能够轻松处理多个请求。 您将能够在不影响 UI 的情况下显着增加超时,并且可以在接收响应时决定是否仍要获取数据。

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何在 1 秒后停止执行方法。 时间?(How to stop excuting a method after say 1 sec. of time?)
    问题 我在java中有一个调用webservice的方法。 现在,如果网络服务花费的时间超过 1 秒。 时间。 我应该能够终止该方法并继续执行程序流程。 回答1 Google Guava 的 SimpleTimeLimiter 将满足您的需求,特别是它的callWithTimeout()方法。 回答2 我建议您使用 Executors 框架并调用 Future.get(long, TimeUnit)。 至于终止该调用,您可以调用Future.cancel(true) 。 当然,您必须submit一个包含调用的Callable 。 回答3 如果您不想添加新库,您可以通过将 Web 服务调用委托给另一个线程并使用 1 秒超时加入它来轻松完成此操作。 下面是一个完成这些任务的完整程序。 有2个关键点: 使用异步线程进行调用并使用 TimeOut 加入它。 您还可以将其设置为守护进程。 当操作中的值不需要被消耗时传递给异步线程,这样它就不会进行不必要的赋值。 代码: public class Main { String returnVar; private static final long TIME_OUT=1000;//in mills private void makeCall() { WebServiceStubDummy ws = new WebServiceStubDummy(
  • 如何正确停止多线程 .NET Windows 服务?(How to properly stop a multi-threaded .NET windows service?)
    问题 我有一个用 C# 编写的 Windows 服务,它创建了大量线程并建立了许多网络连接(WMI、SNMP、简单的 TCP、http)。 当尝试使用服务 MSC 管理单元停止 Windows 服务时,停止服务的调用返回的速度相对较快,但该进程会继续运行大约 30 秒左右。 主要问题是需要 30 多秒才能停止的原因可能是什么。 我可以寻找什么以及如何寻找? 第二个问题是为什么即使进程仍在运行,服务 msc 管理单元(服务控制器)也会返回。 有没有办法让它只在进程实际被杀死时返回? 这是服务的 OnStop 方法中的代码 protected override void OnStop() { //doing some tracing //...... //doing some minor single threaded cleanup here //...... base.OnStop(); //doing some tracing here } 编辑以响应线程清理答案 你们中的许多人都回答说我应该跟踪我所有的线程,然后清理它们。 我不认为这是一种实用的方法。 首先,我无法在一个位置访问所有托管线程。 该软件非常大,包含不同的组件、项目甚至 3rd 方 dll,它们都可以创建线程。 我无法在一个位置跟踪所有这些,或者有一个所有线程检查的标志(即使我可以让所有线程检查一个标志
  • 如何安全地停止在 Windows 服务中运行的 C# .NET 线程?(How do I safely stop a C# .NET thread running in a Windows service?)
    问题 我正在维护一些看起来像这样的代码。 它是一个 Windows 服务,每 30 分钟做一些工作。 ActualWorkDoneHere 方法运行大约需要 30 秒,但如果它在运行时停止,它会使事情处于糟糕的状态。 防止这种情况发生的最佳方法是什么? 我应该用在 onstop 方法中设置为 false 的布尔值替换 While(true) 吗(删除线程 Abort 调用)? 有什么方法可以判断线程是否正在休眠? namespace WorkService { public partial class WorkService : ServiceBase { private Thread _workerThread = null; public WorkService() { InitializeComponent(); } protected override void OnStart(string[] args) { _workerThread = new Thread(new ThreadStart(DoWork)); _workerThread.Start(); } protected override void OnStop() { _workerThread.Abort(); } static void DoWork() { int sleepMinutes = 30
  • 在 C# 中传输数据包时如何正确保持 UI 更新?(How to properly keep the UI updated while transferring packets in C#?)
    问题 我有这个表单,它产生一个新线程并开始在循环中监听和等待 UDP 数据包。 我需要的是使用收到的字节数更新 UI。 为此,我设置了一个事件,我会在收到数据包后立即引发该事件,并将接收到的字节数作为参数传递。 由于我不在 UI 线程上运行,因此我不能简单地直接更新 UI。 这是我目前正在做的事情: private void EVENTHANDLER_UpdateTransferProgress(long receivedBytes) { if(InvokeRequired) { Invoke(new MethodInvoker(() => { totalReceivedBytes += receivedBytes; Label.Text = totalReceivedBytes.ToString("##,0"); })); } } 但这仍然与数据包接收循环在同一线程上运行,并且不会返回到该循环 - 并等待另一个数据包 - 直到此EVENTHANDLER_UpdateTransferProgress方法返回。 我的问题基本上是关于上述方法中的以下行: Label.Text = totalReceivedBytes.ToString("##,0"); 像这样更新 UI 会减慢数据包接收速度。 如果我去掉那条线(或评论它),数据包接收会快得多。 我怎样才能解决这个问题?
  • 如何在c#中正确终止工作线程(How to terminate a worker thread correctly in c#)
    问题 问题陈述 我有一个工作线程,它基本上扫描一个文件夹,进入其中的文件,然后休眠一段时间。 扫描操作可能需要 2-3 秒,但不会更多。 我正在寻找一种优雅地停止这个线程的方法。 说明:我想在线程休眠时停止线程,而不是在扫描时停止线程。 但是,问题是我不知道线程的当前状态是什么。 如果它正在睡觉,我希望它立即退出。 如果它正在扫描,我希望它在尝试阻止时退出。 解决方案的尝试 起初我使用睡眠和中断。 然后我发现 Interrupt 并没有真正中断 Sleep - 它仅在线程尝试进入睡眠状态时才有效。 所以我切换到 Monitor Wait&Pulse。 然后我发现 Pulse 仅在我实际处于等待状态时才有效。 所以现在我有一个看起来像这样的线程: while (m_shouldRun) { try { DoSomethingThatTakesSeveralSeconds(); lock (this) { Monitor.Wait(this, 5000); } } catch (ThreadInterruptedException) { m_shouldRun = false; } } 现在我需要制作我的停止功能。 所以我开始: public void Stop() { m_shouldRun = false; lock (this) { Monitor.Pulse(this); }
  • 如何杀死 C# 线程?(How to Kill a C# Thread?)
    问题 我有一个线程可以在我们的(旧)SQL 服务器上查找数据。 随着数据的进入,我将信息发布到一个模态对话框 - 在所有这些处理过程中,用户不能也不应该做任何其他事情。 模态对话框只是让他们看到我正在做某事,并防止他们同时运行另一个查询。 有时(很少)当代码调用 SQL 服务器时,服务器没有响应(IT 将其关闭以进行维护、LAN 线路被切断或 PC 不在网络上)或执行查询的人没时间了。 所以,模态对话框确实有一个取消按钮。 Thread 对象 (System.Threading.Thread) 具有IsBackground=true 。 当有人单击取消时,我会调用我的KillThread方法。 注意:我不能在这个类中使用 BackgroundWorker 组件,因为它与一些 Windows Mobile 5 代码共享,而 WM5 没有 BackgroundWorker。 void KillThread(Thread th) { if (th != null) { ManualResetEvent mre = new ManualResetEvent(false); Thread thread1 = new Thread( () => { try { if (th.IsAlive) { //th.Stop(); // 'System.Threading.Thread' does
  • C#:产生连续音直到被打断(C#: Produce a continuous tone until interrupted)
    问题 我有一个用户与 C# WPF 程序一起交互的设备。 当用户按下设备上的按钮时,该程序必须发出哔哔声,持续指定的时间或用户按下按钮的时间,以较短者为准。 唯一可产生蜂鸣声/提示音的扬声器是计算机 BIOS 扬声器; 我们不能假设周围有其他发言者(并且假设不会有任何其他发言者实际上是安全的)。 如何在必要的时间内产生连续的音调? 到目前为止我所拥有的会产生很多哔哔声,但不是连续的音调。 首先,启动一个线程: private void UserControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { if(this.Visibility == Visibility.Visible){ mBeepThread = new Thread(new ThreadStart(ProduceTone)); mBeepThread.Name = "Beep Thread"; mBeepThread.Start(); } } 线程本身: bool mMakeTone = false; private void ProduceTone(){ while(this.Visibility == Visibility.Visible){ if(mMakeTone ){ Console.Beep(); }
  • c# - 如果方法运行时间过长,则中止方法的执行(c# - abort the execution of a method if its taking too long to run)
    问题 如果运行时间太长,我如何中止方法的执行? 例如 string foo = DoSomethingComplex(); 但是如果DoSomethingComplex()花费的时间太长(可以说是 20 秒)。 然后只需将 foo 设置为 ""; 回答1 您可以创建一个运行您的方法的新线程,然后: thread.Start(); bool success = thread.Join(20000); 如果线程在指定时间之前成功完成,则 Join 返回 true。 显然,不会中止该方法(可能无法直接执行此操作),而是中止线程 - 但似乎可以完成您想要的。 一个简单的线程代码示例可能如下所示。 注意我对带参数的签名做了一些假设,所有这些都在某个类中,等等。对于方法: public string DoSomethingComplex(int param) 然后在同一个班级: public delegate void Callback(string newFoo); public void ThreadedDoSomethingComplexEnded(string newFoo) { foo = newFoo; } private static void ThreadedDoSomethingComplex(ClassFooIsIn fooObject, int param
  • 如何在 C# 的控制台应用程序中使用键盘输入停止正在运行的方法?(How to stop a running method with keyboard input in a Console Application on C#?)
    问题 简而言之,我正在使用 C# 进行科学计算,并且我编写了一个方法,该方法具有一个 while 循环,该循环可以运行到用户指定的步骤数量......实际上,这个方法可能需要很长时间才能执行(比如更多超过 5 小时)。 例如,当需要这么长时间时,我可能想停止按Esc键的方法。 当我读到一些关于中断while内容while ,它就像一个Boolean标志或类似的东西一样简单。 所以我想到了这样的事情: public Double? Run(int n) { int i = 0; while ((i < n) && (/* inputkey != ConsoleKey.Escape */)) { // here goes the heavy computation thing // and I need to read some "inputkey" as well to break this loop i++; } // I'm not worried about the return statement, as it is easy to do... // returns null if the user skipped the method by pressing Escape // returns null if the method didn't converged //
  • 如何在 C# 中解析文本文件并进行 io 绑定?(How to parse a text file in C# and be io bound?)
    问题 众所周知,如果您从磁盘读取数据,您会受到 IO 限制,并且您可以比从磁盘读取数据更快地处理/解析读取的数据。 但是这种常识(神话?)并没有反映在我的测试中。 当我读取一个文本文件时,每行中用空格分隔的 double 和 int 都比我的物理磁盘速度慢得多(因子 6)。 文本文件看起来像这样 1,1 0 2,1 1 3,1 2 更新当我在一次读取中使用完整缓冲区执行 ReadFile 以获得“真实”性能时,我已经包含了 PInvoke 性能。 ReadFile 性能 - ReadFileIntoByteBuffer StringReader.ReadLine 性能 - CountLines StringReader.Readline 不安全性能 - ParseLinesUnsafe StringReader.Read 不安全的字符 buf - ParseLinesUnsafeCharBuf StringReader.ReadLine + 解析性能 - ParseLines 结果是 Did native read 179,0MB in 0,4s, 484,2MB/s Did read 10.000.000 lines in 1,6s, 112,7MB/s Did parse and read unsafe 179,0MB in 2,3s, 76,5MB/s Did parse
  • C#性能分析-如何计算CPU周期?(C# performance analysis- how to count CPU cycles?)
    问题 这是进行性能分析的有效方法吗? 我想获得纳秒精度并确定类型转换的性能: class PerformanceTest { static double last = 0.0; static List<object> numericGenericData = new List<object>(); static List<double> numericTypedData = new List<double>(); static void Main(string[] args) { double totalWithCasting = 0.0; double totalWithoutCasting = 0.0; for (double d = 0.0; d < 1000000.0; ++d) { numericGenericData.Add(d); numericTypedData.Add(d); } Stopwatch stopwatch = new Stopwatch(); for (int i = 0; i < 10; ++i) { stopwatch.Start(); testWithTypecasting(); stopwatch.Stop(); totalWithCasting += stopwatch.ElapsedTicks; stopwatch.Start()
  • C# Thread.Sleep(1000) 在某些 pc 上花费的时间远远超过 1000 毫秒(C# Thread.Sleep(1000) takes much more than 1000ms on some pc)
    问题 我编写了 ac# 程序来倒计时 5 秒。 我要做的是: new Task(() => { try { this.Invoke((Action)delegate() { label1.Text = "5"; // 4, 3, 2..etc }); } Thread.Sleep(1000); } catch { // form could be disposed break; } } }).Start(); 这适用于我的 PC,但是,当我将程序复制到 Windows 平板电脑时,Thread.Sleep(1000) 给出了超过 1 秒的时间。 换句话说,从5、4、3、2、1更新标签需要5秒多(实际上是10多秒)。 或者,更新 label1.Text = "5" 等需要很长时间? 这对我来说没有意义。 我想知道怎么了? 回答1 在再次激活线程之前, Sleep将至少等待那么长时间,但它总是可以比这更长。 一秒钟过去后,线程变得有资格由 CPU 调度程序执行,并且调度程序可以随时运行它。 如果它特别忙,和/或使用的调度算法不专注于快速允许新的活动线程运行,则可能需要一些时间。 回答2 Servy的回答是正确的。 有关更多详细信息,请阅读文档: https://msdn.microsoft.com/en-us/library/windows/desktop/ms686298.aspx
  • 如果线程花费太长时间,如何停止线程(How to stop a thread if thread takes too long)
    问题 我有一种情况,我将数据导出到文件中,我被要求做的是提供一个取消按钮,如果导出时间过长,单击该按钮将停止导出。 我开始在一个线程中导出到文件。 我尝试在单击按钮时中止线程。 但它不起作用。 我在 Google 上搜索,发现不推荐使用 abort()。 但是我还应该选择什么来实现它? 我目前的代码是: private void ExportButtonClick(object param) { IList<Ur1R2_Time_Points> data = ct.T_UR.ToList(); DataTable dtData = ExportHelper.ToDataTable(data); thread = new Thread(new ThreadStart(()=>ExportHelper.DataTableToCsv(dtData, "ExportFile.csv"))); thread.SetApartmentState(ApartmentState.STA); thread.IsBackground = true; thread.Name = "PDF"; thread.Start(); } private void StopButtonClick(object param) { if (thread.Name == "PDF") { thread.Interrupt
  • 在C#中调整HttpWebRequest连接超时(Adjusting HttpWebRequest Connection Timeout in C#)
    问题 我相信经过长时间的研究和搜索,我发现通过建立异步连接并在所需的超时时间后终止该连接可能会更好地实现我想做的事情。 快速代码片段: HttpWebRequest webReq = (HttpWebRequest)HttpWebRequest.Create(url); webReq.Timeout = 5000; HttpWebResponse response = (HttpWebResponse)webReq.GetResponse(); // this takes ~20+ sec on servers that aren't on the proper port, etc. 我在多线程应用程序中有一个HttpWebRequest方法,在该方法中,我正在连接到大量公司的Web服务器。 在服务器没有响应的情况下,即使我仅指定了5秒的超时时间, HttpWebRequest.GetResponse()需要20秒钟的超时时间。 为了定期访问服务器,我想跳过连接时间超过5秒的服务器。 所以问题是: “是否有一种简单的方法来指定/减少WebRequest或HttpWebRequest的连接超时?” 回答1 我认为问题在于WebRequest仅在实际发出请求之后才测量时间。 如果您向同一地址提交多个请求,则ServicePointManager将限制您的请求
  • C#如何暂停计时器?(C# How to pause a timer?)
    问题 我有一个C#程序,如果用户停止与该程序的交互,我需要计时器停止。 它需要做的是暂停,然后在用户再次变为活动状态时重新启动。 我进行了一些研究,发现其中包含以下命令: timer.Stop(); 和 timer.Start(); 但我想知道是否有一个: timer.Pause(); 然后,当用户再次变为活动状态时,它会从上次中断的地方开始,并且不会重新启动。 如果有人可以提供帮助,将不胜感激! 谢谢, 弥迦 回答1 您可以通过使用.NET中的Stopwatch类来实现此目的。 通过简单地停止和启动,您可以继续使用秒表实例。 确保using System.Diagnostics; var timer = new Stopwatch(); timer.Start(); timer.Stop(); Console.WriteLine(timer.Elapsed); timer.Start(); //Continues the timer from the previously stopped time timer.Stop(); Console.WriteLine(timer.Elapsed); 要重置秒表,只需调用Reset或Restart方法,如下所示: timer.Reset(); timer.Restart(); 回答2 我为这种情况创建了此类: public class
  • 如何让java程序执行一段时间后停止
    如何让java程序执行一段时间后停止 1、概述 在本文中,我们将学习如何在一段时间后结束长时间运行的任务。我们将探讨这个问题的各种解决方案。此外,还将介绍各种方案缺点。 2、使用循环 假设我们在一个循环中处理一组数据,比如电子商务应用程序中循环获取产品项的一些信息,但可能没有必要完成所有项的处理。 实际上,我们希望只处理某一特定时间之前的内容,在此之后,我们希望停止执行,并显示列表在此时间之前处理的内容。 代码例子如下: long start = System.currentTimeMillis(); long end = start + 30*1000; while (System.currentTimeMillis() < end) { // 一些费时的操作 } 在这里,如果时间超过了30秒的限制,循环将中断。在上述解决方案中有一些我们值得注意的地方: 结果无法准确预测:循环运行的时间可能超过规定的时间限制。这将取决于每个迭代可能花费的时间。例如,如果每次迭代可能花费7秒,那么总时间可能会增加到35秒,这比期望的30秒时间限制大约多17%。阻塞:在主线程中这样的处理可能不是一个好主意,因为它会阻塞很长一段时间。相反,这些操作应该与主线程解耦。 3、使用中断机制 在这里,我们将使用一个单独的线程来执行长期运行的操作。在超时时,主线程将向工作线程发送一个中断信号
  • 如何在 C# 中以有效的方式将文本文件转换为二进制文件(How to convert text files to binary in an efficient way in C#)
    问题 我检查了几种将文本文件转换为二进制文件的方法,并在这里找到了一些答案。 但是,由于 Unity .NET 兼容性,它们中的大多数让我感到困惑,我也对如何将文本转换为二进制的结构感到困惑。 我有一个文本文件(导出的点云),其中包含 3D 空间中点的位置和颜色信息,如下所示: X Y Z colorvalues -0.680891 -90.6809 0 204 204 204 255 我正在阅读本文以使用如下脚本在运行时创建网格: string[] buffer; for (int i = 0; i < Area.nPoints; i++) { buffer = sr.ReadLine().Split(); Area.AddPoint(new Vector3(float.Parse(buffer[0]), float.Parse(buffer[1]), float.Parse(buffer[2]))); } 这是有效的,但由于我读取行并将它们拆分,因此速度很慢,我的文本文件中有大约 7500 万行(点)。 我发现我可以将它转换为二进制,并且读取速度会更快,我做到了,而且速度要快得多。 但是,现在转换为二进制部分很慢,我想问你我转换的方式。 void WriteValues() { string[] buffer; for (int i = 0; i < numPoints; i+
  • 暂停批处理文件,直到服务停止完成?(Halt batch file until service stop is complete?)
    问题 我正在使用批处理文件来停止 Windows 服务。 我正在使用sc命令,但是考虑到以下问题,我愿意接受其他想法。 问题是,该批处理文件,而服务正在停止前进(在stop参数sc似乎只是要求停止-它不等待停止)。 如何修改批处理文件,直到停止完成才继续处理? 回答1 您可以使用NET stop ,它是同步的,即它将等待直到服务停止。 参见-NET停止 回答2 sc stop webdriveservice :loop sc query webdriveservice | find "STOPPED" if errorlevel 1 ( timeout 1 goto loop ) 回答3 如上所述,NET STOP将向该服务发送停止命令,但是,如果该服务花费的时间超过一定时间(我的观察是20秒左右),则NET STOP将不会等待该服务真正停止才返回。 要实际上暂停批处理文件直到服务停止,您需要使用类似于这些线程中概述的方法: 如何检查服务是否通过批处理文件运行并启动(如果未运行)? 停止/启动远程Windows服务并等待其打开/关闭 回答4 我相信net stop [Service]应该等到服务完全停止后再继续。 sc stop [Service]只需向sc stop [Service]发送“停止”消息。 回答5 这有点粗糙,但对我有用
  • C# Windows 服务——本地计算机上的服务启动然后停止?(C# Windows Service -- the service on local computer started and then stopped?)
    问题 我正在尝试创建我的第一个 Windows 服务,但很难过......在我从 services.msc 手动启动服务后,消息“本地计算机上的服务启动然后停止。 有些服务会自动停止,因为它们没有工作可做” 我确定我的代码中一定有一些错误...... namespace ConvertService { public partial class Service1 : ServiceBase { public Service1() { this.ServiceName = "ConvertService"; this.EventLog.Log = "Application"; } static void main() { ServiceBase.Run(new Service1()); } protected override void OnStart(string[] args) { Process pMP3 = new Process(); pMP3.StartInfo.UseShellExecute = false; pMP3.StartInfo.RedirectStandardOutput = true; pMP3.StartInfo.FileName = @"d:\...path...\converter.exe"; pMP3.StartInfo.Arguments = @
  • 是否可以在 Java 中的指定时间内停止函数的执行?(Is it possible to stop a function's execution within a specified time in Java?)
    问题 我想知道如何在java中的指定时间内停止指定函数的执行。 例如:我可能会调用一个名为 print_data() 的函数。 如果执行需要更多时间,我将不得不停止该函数的执行。 是否可以像这样停止执行? 提前致谢 回答1 您可以向函数添加一些检查:保存函数开始工作时的时间戳,然后定期检查函数内部的时间戳,如果函数运行时间过长则抛出异常。 这是在 Java 中完成此类任务的最简洁的方法。 回答2 没有安全的方法来停止线程的执行,除非它是协作的; 例如,它会定期检查“中断”标志。 @BobbyShaftoe 在评论中建议: 您可以在单独的线程中执行此函数,然后在一段时间后中止该线程。 这是误导性和危险的建议。 “中止”线程的唯一方法是使用已弃用的Thread.stop()方法。 如果您查看该方法的 javadoc,您会发现它是一种从根本上说是危险的方法,容易产生不良和不可预测的副作用。 还应该注意的是,@tonio 的解决方案不会停止函数的执行。 它只是停止等待函数的执行完成。 该函数可能会无限期地继续执行,消耗资源没有任何效果。 回答3 您可以使用java.util.concurrent的 TimeUnit 枚举,特别是timedJoin方法。 您指定等待时间和线程。 timedJoin将让您的线程执行直到终止,或者如果处理花费的时间超过允许的超时时间,则停止。