C# 中止无限多字符串调用

C# 中止无限多字符串调用,c#,lua,C#,Lua,可能重复: 这是一个针对C#的Lua(Lua接口)特定问题,它与本机C Lua不一样,因此如果您没有Lua C#方面的经验,请三思,如果您的答案对我有帮助,谢谢 所以问题是如果用户提供这样的脚本 while (true) do end 我怎么能干净利落地放弃它而不让Lua死在我身上?我已经尝试了很多方法,仅仅从一个单独的线程调用lua.Close(),在调用luaapi时就会出现无保护的错误(尝试索引一个nil值)错误,问题的根源是lua不是线程安全的,因为我必须从一个单独的线程调用Clos

可能重复:

这是一个针对C#的Lua(Lua接口)特定问题,它与本机C Lua不一样,因此如果您没有Lua C#方面的经验,请三思,如果您的答案对我有帮助,谢谢

所以问题是如果用户提供这样的脚本

while (true) do end
我怎么能干净利落地放弃它而不让Lua死在我身上?我已经尝试了很多方法,仅仅从一个单独的线程调用lua.Close(),在调用luaapi时就会出现无保护的错误(尝试索引一个nil值)错误,问题的根源是lua不是线程安全的,因为我必须从一个单独的线程调用Close(主线程正忙于为DoString调用提供服务)这有点问题。我尝试添加一个调试钩子,还检查了DoString线程和钩子之间的线程ID是否相同,并且它们是相同的,因为钩子中执行的任何操作都是在DoString线程上执行的。这没有帮助,仍然会出现异常。如何…在Lua C#中中止DoString

谢谢

编辑

更进一步说,如果我处理lua类,我会在运行infiniteDoString的线程中得到一个异常,在VStudio的调试中,我可以捕获这个异常并进行恢复。但是如果我在debug或release中运行exe,我有时无法恢复并崩溃!?我从DoString线程中得到的错误是

试图读取或写入受保护的内存。这通常表示其他内存已损坏。

你是如何在Lua C#中中止一个DoString的

<> P>无论是C++、C、C++还是别的什么都不要紧。Lua并不是仅仅因为你想要它而停止它。它本身就是单线程的,这意味着当它返回时,Lua脚本的执行会停止。因为在一个线程激活时从一个线程调用LUA状态是不合法的,所以你不能做太多的直接操作。y

Lua根本不打算以这种方式使用

如果我处理lua类


您无法在Lua状态运行时处理它。如果从调试挂钩引发异常不起作用,那么您将无能为力。

哪个“Lua for C#”你在说什么?不止一个?是的,我个人更喜欢它在Mono下运行。Pondidum,它能更好地处理上述问题吗?不幸的是,当我读到你的问题时,我对它进行了快速测试。谢谢你的回答。你如何表示Lua错误?我试着只做一个Lua.DoString(“垃圾”)把钩子打进去,但它不会help@Anders:事实上,我意识到LuaInterface的错误机制可能不起作用,因为Lua的错误是通过setjmp/longjump工作的,这可能对LuaInterface不起作用。所以很有可能你根本无法做到这一点。我不喜欢依赖用户做正确的事情。他们怎么能设计得这么糟糕:/@Anders:它的坏处是什么?Lua正在做它应该做的事情:执行给定的代码。如前所述,它是一个单线程API。在单线程规则下,不可能从外部世界取消或关闭它。因为单线程系统中没有外部世界。这不坏;它只是不做你想要什么;)哦,你可以抛出一个异常作为触发错误的手段。这是一个客户端应用程序,它会挂起整个应用程序。挂起的应用程序是蹩脚的。。。我试着从钩子上做一个DoString(“抛出错误的线”),但它不会中断无限的DoString