【问题标题】:Thread queue with timeout in VB . NETVB 中超时的线程队列。网
【发布时间】:2016-02-03 10:37:19
【问题描述】:

我有一个函数,它通过 dll 中包含的函数在数据库中执行一些任务。该函数需要使用不同的参数多次执行,但有时需要太多时间,需要终止进程并继续队列。 de dll中的函数没有任何超时选项,所以我试图控制这个创建一个线程。我不习惯使用线程,但经过一些研究,我做了如下代码:

 Dim Thread As New Threading.Thread(AddressOf Function)
    Thread.Start()
    Thread.Join(maxTime)

    If(Thread.IsAlive) Then

        WriteLogFile("Error [....]")
        Thread.Abort()
    End If

可能这不是更聪明或最优雅的方法,但当我测试它时它似乎工作,但现在我看到“超时”不起作用。好吧,如果我将超时设置为几秒钟,它似乎工作得很好。但是如果我将它设置为 10 分钟,这正是我所需要的,那么所花费的时间要比 10 分钟多得多。我可以预料到 Thread.join() 可能并不完全准确,但差别不是几秒钟。

我尝试了许多类似的方法,所以我不知道我是否有正确的问题焦点。也许代码的故障来自.dll函数的工作方式,但首先我需要放弃自己出错的可能性(我认为更有可能)。

¿谁能告诉我错误在哪里,或者其他更安全的方法?

提前致谢。

【问题讨论】:

  • Thread.Join() 精确到 16 毫秒。接下来发生的事情不是,您可以实际上中止线程的可能性永远不会那么好。线程必须处于正确的状态才能允许中止,这几乎总是要求它执行托管代码。在森林中执行本机代码的可能性总是很高。可靠、快速和安全地执行此操作的唯一方法是在单独的进程中运行该代码。一个你总是可以杀死()的人。
  • 由于非托管代码的性质,在实现分离过程时遇到了一些麻烦,但我认为我已经完成了这项工作。此外,这很有启发性,因为我从未使用过这些东西,并帮助我理解旧版本中分离的、注释代码的残余。非常感谢,汉斯。

标签: vb.net multithreading timeout


【解决方案1】:

从汉斯的评论中回答。为了控制非托管代码的执行,线程无法提供适当的处理来完成函数,因此要实现真正的超时限制器,需要在称为进程的其他项目中启动该函数,以便能够调用Kill() 函数,它真正停止了进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2014-11-10
    • 1970-01-01
    • 2013-04-18
    相关资源
    最近更新 更多