Thread.Sleep只适用于断点?

时间:2014-07-24 19:35:04

标签: c# multithreading lua

我有一个lua脚本调用名为“delay”的方法,该方法调用以下内容:

public void Delay(int millisecondsTimeout)
{
     Thread.Sleep(millisecondsTimeout);
}

然而,当lua脚本调用它时,它似乎忽略了这行代码,只是在不阻塞线程的情况下运行其余代码(脚本在不同的线程上运行)。

但是,当我在Thread.Sleep行上放置一个断点时,它会按预期工作。

为什么会这样?这太奇怪了!

编辑:这是我创建脚本线程的方式:

new Thread(() =>
                {
                    this.Script.DoFile(this.Path);
                }).Start();

我使用lua.RegisterFunction来注册方法,它调用它就好了。

1 个答案:

答案 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()