【问题标题】:Is it good practice to use threads to timeout of a function?使用线程使函数超时是一种好习惯吗?
【发布时间】:2014-04-01 02:12:29
【问题描述】:

我们有一个打开文件的函数(文件是自定义的 .oxr 文件)。问题是有时文件已损坏并且程序停止并且不继续并退出功能。因此整个程序都会受到影响。

我正在尝试开发一种方法,该方法会在几秒钟后使该功能超时。我已经使用线程实现了这一点。这是概念:- 我通过使用“thread.join”方法将函数作为线程调用,该方法等待几秒钟以执行线程函数。超时后,我只是中止线程。因此,调用在调用线程的点之后返回到代码。它按预期工作!

这个概念是好的做法吗?

【问题讨论】:

  • 不,这不是一个好习惯。在您自己的进程中中止线程是不好的。如果您无法修复您的功能,请在单独的子进程中运行此不稳定操作并终止它。
  • @Aschratt,合作取消在这里不是一个选项,除非 OP 可以修复他的功能来处理损坏的数据(他应该首先做的)。
  • 通话卡住时,是卡在循环还是阻塞?假设被阻塞,它被阻塞在什么呼叫上?
  • .oxr 格式的自定义文件已损坏,因此被阻止。那么会发生什么情况是文件在内部以代码打开,但卡在内部消息框,该消息框在通过代码访问时不会弹出...您是否遇到损坏的 .doc 文件.. Microsoft 已经创建了在文件时检测和超时的方法由于损坏原因无法打开...但这是我们的自定义代码..

标签: c# multithreading timeout


【解决方案1】:

你对这个概念有很多问题:

  1. 用异步代码很难实现,因为线程在执行过程中可能会发生变化,例如:方法发出一个Web请求(线程1),回调可以由另一个线程执行(取决于你的同步上下文)。

  2. 线程很昂贵。创建或停止线程需要很长时间,每个线程消耗大约 4 MB afaik。

  3. 当您中止线程时,您的对象会处于未定义状态,当您在对象上调用方法时,您无法预测会发生什么。

  4. 您无法通过线程中止来停止异步操作。

在我看来,如果您别无选择,可以这样做,我猜像 IIS 这样的系统也有一些中止机制来提高稳定性,但您应该尽量不要这样做。

【讨论】:

    猜你喜欢
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 2019-03-06
    • 2013-03-30
    • 2015-09-02
    • 2017-11-23
    相关资源
    最近更新 更多