我有一个lua脚本调用名为“delay”的方法,该方法调用以下内容:
public void Delay(int millisecondsTimeout)
{
Thread.Sleep(millisecondsTimeout);
}
然而,当lua脚本调用它时,它似乎忽略了这行代码,只是在不阻塞线程的情况下运行其余代码(脚本在不同的线程上运行)。
但是,当我在Thread.Sleep行上放置一个断点时,它会按预期工作。
为什么会这样?这太奇怪了!
编辑:这是我创建脚本线程的方式:
new Thread(() =>
{
this.Script.DoFile(this.Path);
}).Start();
我使用lua.RegisterFunction来注册方法,它调用它就好了。
答案 0 :(得分:0)
然而,当lua脚本调用它时,它似乎忽略了这行代码,只是在不阻塞线程的情况下运行其余代码(脚本在不同的线程上运行)。
如果脚本在另一个线程上运行,则应该在该线程上调用sleep。如果调用Thread.Sleep,它将睡眠当前正在执行的线程。例如:
线程A - >启动线程B - 如果在线程A中调用Thread.Sleep,则会休眠线程A,而不是线程B。
由于你的线程代码中没有循环,因此无法在线程B中调用Thread.Sleep。
一种可能的解决方案是从主线程挂起后台线程。
myBackgroundThread = new Thread(() => //myBackgroundThread is a private variable.
{
this.Script.DoFile(this.Path);
}).Start();
并从主线程::
myBackgroundThread.Suspend();
Thread.Sleep(ms);
myBackgroundThread.Resume()