中止一个无限的 DoString调用。

可能是重复问题:

如何防止 Lua 无限循环

这是一个针对 C#(Lua 接口)中的 Lua 特定问题,不适用于原生的 C Lua,请在回答问题之前三思而后行,谢谢。

问题是,如果用户提供了以下脚本,该怎么办才能干净地终止它,而不让 Lua 反咬一口?

while (true) do end

我试过很多方法,比如从另一个线程调用 lua.Close(),但它只会给出无保护的错误调用 Lua API (试图索引空值)的错误提示。问题的根源在于 Lua 不是线程安全的,并且由于我必须从另一个线程调用 close(主线程正忙于处理 DoString 调用),所以这是个棘手的问题。我尝试添加了一个调试钩子,并检查了 DoString 线程和钩子之间的线程 ID 是否相同,并且它们相同,因此在钩子中执行的任何内容都将在 DoString 线程上执行。但这仍然无济于事,仍然会出现异常。在 Lua C# 中,怎么才能中止 DoString 操作呢?

谢谢。

编辑

我有一些进展,如果我释放了 Lua 类,我就会在运行无限循环的 DoString 的线程中得到异常。在从 VStudio 的调试中我可以捕捉到这个错误并进行恢复。但是如果我以调试或发布运行 exe 文件,有时候就不能进行恢复,而会崩溃。我从 DoString 线程得到的错误提示是 试图读取或写入受保护的内存, 这常常是其他内存已经损坏的迹象。

点赞
用户734069
用户734069

如何在 Lua C# 中取消 DoString?

无论是来自 C#、C、C++ 还是其他任何语言,Lua 不会因为你想要其停止而停止。它是固有的单线程,这意味着Lua脚本的执行将在返回时停止。而且,由于不允许在一个线程活动时从另一个线程调用 Lua 状态,因此你无法直接做太多事情。

Lua 并不是以这种方式使用的。

如果我释放 Lua 类

你不能在其运行时 dispose Lua 状态。如果从调试钩子中抛出异常无效,则你就无能为力。

2012-07-24 08:05:30